无法从测试项目访问静态常量

Posted

技术标签:

【中文标题】无法从测试项目访问静态常量【英文标题】:Cannot access static constants from testing project 【发布时间】:2013-09-22 07:09:21 【问题描述】:

对于我的单元测试,我尝试在我的测试项目中使用我的主项目的静态类 (ModelConstants) 中的常量。

int ones = ModelConstants.PLOT_STORE_PRECISION_FACTOR * ModelConstants.RECENT_SAMPLES;

在尝试运行此测试方法时,我在上面的行中得到一个TypeInitializationException。 InnerException 是一个FileNotFoundException,表示找不到程序集System.Windows。这对我来说毫无意义,但我猜静态常量类可能无法正确初始化。这可能是什么原因?

顺便说一句,我可以毫无问题地实例化我的主项目的非静态类。

编辑:

常量定义如下:

public static readonly int TRACKING_INTERVAL = 200;
public static readonly int SAMPLE_WINDOW = 3;
public static readonly int PLOT_STORE_PRECISION_FACTOR = 1000 / TRACKING_INTERVAL;

【问题讨论】:

这些常量是否与const 中的一样?如果是这样,我会很惊讶你会在这里得到一个运行时异常,因为编译器应该把它编译进去。 请分享ModelConstants代码sn-p 好的,添加它们。问题可能是一个依赖于另一个常数吗?它们在我的主代码中工作得很好。 【参考方案1】:

根据您提供的数据,我看到错误的唯一可能原因是 ModelConstants 类有一个 static constructor,由于某种原因,它仅在测试项目中引发异常。

可能是构造函数访问了一些未在测试项目中初始化的全局状态。

【讨论】:

永远不要在静态构造函数中触碰其他类型的静态成员。【参考方案2】:
public static readonly int TRACKING_INTERVAL = 200;
public static readonly int SAMPLE_WINDOW = 3;
public static readonly int PLOT_STORE_PRECISION_FACTOR = 1000 / TRACKING_INTERVAL;

那些不是常数。这些是类静态字段。当读取此类字段时,将调用静态类构造函数。你有你的TypeInitializationException,它会引发类型初始化。原因在InnerException

相反,我建议使用常量:

public const int TRACKING_INTERVAL = 200;
public const int SAMPLE_WINDOW = 3;
public const int PLOT_STORE_PRECISION_FACTOR = 1000 / TRACKING_INTERVAL;

这些在编译时被检查和访问,甚至可以提高性能。

【讨论】:

酷,将static readonly 更改为const(在可能的情况下)就可以了。我使用readonly 的最初原因是因为我在Java 的家中并搜索final static 的替代品并找到了这个线程:***.com/questions/1327544/… :) @CedricReichenbach - 对于它的价值,如果你想要一个“常量”类变量,你必须将它声明为static readonly 而不是const。值类型只能使用 const

以上是关于无法从测试项目访问静态常量的主要内容,如果未能解决你的问题,请参考以下文章

无法从我的项目根目录访问静态 build.html

无法通过单元测试中的 Sitecore 上下文访问 Sitecore 模拟项目(MS Fakes)

从 XCode UI 测试目标访问项目文件

自动化测试项目config常量

自托管 web api 并从单元测试项目中访问它

将静态库转换为DLL会导致在main之前发生访问冲突