40

我想为下面的课程编写单元测试。
如果名称不是“MyEntity”,则 mgr 应为空白。
负单元测试
使用管理器私有访问器我想将名称更改为“测试”,以便管理器应该为空。然后将验证经理值。为此,我想显式调用静态构造函数,但是当我使用调用静态构造函数时

Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null); 

name 始终设置为“MyEntity”如何将 name 设置为“Test”并调用静态构造函数。

public class Manager
{        
        private static string name= "MyEntity";

        private static object mgr;

        static Manager()
        {
            try
            {
                mgr = CreateMgr(name);
            }
            catch (Exception ex)
            {
                mgr=null;
            }
        }
}
4

4 回答 4

49

正如我今天发现的,可以直接调用静态构造函数:

来自另一个 Stackoverflow 帖子

其他答案非常好,但是如果您需要强制类构造函数在没有引用类型(即反射)的情况下运行,您可以使用:

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  

我不得不将此代码添加到我的应用程序中以解决 .net 4.0 CLR 中可能存在的错误

于 2015-04-08T09:51:11.777 回答
9

对于任何发现此线程并想知道...我刚刚进行了测试的人。如果由于其他原因尚未运行静态构造函数,它似乎System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor()只会运行它。

例如,如果您的代码不确定先前的代码是否已经访问了该类并触发了静态构造函数运行,那么这无关紧要。先前的访问将触发静态构造函数运行,但 RunClassConstructor() 也不会运行它。RunClassConstructor() 仅在静态构造函数尚未运行时才运行。

在 RunClassConstructor() 之后访问类也不会导致静态构造函数再次运行。

这是基于在 Win10 UWP 应用中的测试。

于 2017-06-15T00:18:25.640 回答
4

只需将public static void Initialize() { }方法添加到您的静态类并在需要时调用它。这与调用构造函数非常相似,因为静态构造函数会被自动调用。

于 2019-06-01T13:53:33.343 回答
3

如果你的类中有一个静态成员(必须有,否则静态构造函数不会做太多),那么不需要显式调用静态构造函数。

只需访问您想要调用其静态构造函数的类。例如:

public void MainMethod()
{
    // Here you would like to call the static constructor

    // The first access to the class forces the static constructor to be called.
    object temp1 = MyStaticClass.AnyField;

    // or
    object temp2 = MyClass.AnyStaticField;
}
于 2016-09-14T19:55:29.030 回答