代码之家  ›  专栏  ›  技术社区  ›  Allen

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

  •  1
  • Allen  · 技术社区  · 7 年前

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

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

    1 回复  |  直到 7 年前
        1
  •  -2
  •   Vijayanath Viswanathan    7 年前

    首先让我告诉你,你不能嘲笑DateTime。“Now”是一个静态属性。模拟的主要思想是解耦依赖关系,并且应该将依赖关系注入相应的类来模拟它。这意味着您必须实现一个到依赖类的接口,并且该接口应该注入到使用依赖类的类中。对于单元测试,模拟相同的接口。因此,接口永远不适合静态,因为接口总是需要concreate类类型,您必须实例化实现相同接口的类。

    话虽如此,如果你在使用MSTest,有一个叫做Shim的概念(尽管我不是Shim的忠实粉丝)。您可以创建假部件。在您的情况下,您可以创建“System”和伪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);  
            }  
        }  
    

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