如何在 dotnetcore 2.0 单元测试中模拟静态 属性 或方法

How to Mock Static property or method in dotnetcore 2.0 unit test

我在.net框架的MSTest2项目中使用了MS Fake框架来模拟静态成员,例如

System.DateTime.Now

在dotnet core 2.0中是否有等效的框架可以做与Fake相同的事情?

首先让我告诉你不能模拟 DateTime.Now 因为 'Now' 是静态的 属性。 mocking 的主要思想是解耦依赖关系,并且应该将依赖项注入相应的 classess 来模拟它。这意味着您必须实现一个到依赖项 class 的接口,并且该接口应该注入到消耗依赖项 class 的 class。用于单元测试 Mock 相同的接口。所以接口永远不会适合 Static 因为接口总是期望一个 concreate class 类型并且你必须实例化实现相同接口的 class.

话虽如此,如果您使用的是 MSTest,则有一个名为 Shim 的概念(不过我不是 Shim 的忠实粉丝)。您可以创建假程序集。在您的情况下,您可以创建 'System' 和 Fake DateTime 的假程序集,如下所示,

[TestMethod]  
    public void TestCurrentYear()  
    {  
        int fixedYear = 2000;  

        // Shims can be used only in a ShimsContext:  
        using (ShimsContext.Create())  
        {  
          // Arrange:  
            // Shim DateTime.Now to return a fixed date:  
            System.Fakes.ShimDateTime.NowGet =   
            () =>  
            { return new DateTime(fixedYear, 1, 1); };  

            // Instantiate the component under test:  
            var componentUnderTest = new MyComponent();  

          // Act:  
            int year = componentUnderTest.GetTheCurrentYear();  

          // Assert:   
            // This will always be true if the component is working:  
            Assert.AreEqual(fixedYear, year);  
        }  
    }  

要使用 Shim 或创建假程序集,您需要 visual studio 终极版及更高版本。

请阅读有关垫片的更多信息here