C# WPF/.NET:我不能用假模拟完全替换具体类吗?
我有一个大型的遗留WPF应用程序,它没有进行单元测试,到处都有大量的依赖关系。我试图使用Moq来创建单元测试,但这对我没有多大帮助,因为太多(=几乎所有)类在内部创建依赖项,所以我无法注入模拟对象而不是真正的引用 <>在C++中,你可以编写自己的冒牌类,并确保它们在测试项目中的真实对象之前被包含在-> >方式>强>所有引用< /强>中,可以在整个项目中引用假对象,包括所有内部引用。 在.NET中是否没有办法实现同样的功能 提前感谢您的建议 -塞波 另外,这是对前面一个问题的跟进。应该做您希望它做的事情,但它仅在Visual Studio Ultimate和Premium上可用 除了MS Fakes/Shimes,C#开箱即用(或我知道的任何免费库)中没有任何东西可以满足您的需要。您可以使用“部分模拟”。假设您的类A在A中内部创建了类B的实例,例如私有方法 您可以将新的ClassB()移动到工厂方法C# WPF/.NET:我不能用假模拟完全替换具体类吗?,c#,.net,wpf,unit-testing,moq,C#,.net,Wpf,Unit Testing,Moq,我有一个大型的遗留WPF应用程序,它没有进行单元测试,到处都有大量的依赖关系。我试图使用Moq来创建单元测试,但这对我没有多大帮助,因为太多(=几乎所有)类在内部创建依赖项,所以我无法注入模拟对象而不是真正的引用 在C++中,你可以编写自己的冒牌类,并确保它们在测试项目中的真实对象之前被包含在-> >方式>强>所有引用< /强>中,可以在整个项目中引用假对象,包括所有内部引用。 在.NET中是否没有办法实现同样的功能 提前感谢您的建议 -塞波 另外,这是对前面一个问题的跟进。应该做您希望它做的事
受保护的虚拟方法CreateClassB(…),然后使用Moq
所以如果你在测试ClassA的方法A
[Test]
public void MethodA_StateThatYouAreTesting_ExpectedResult()
{
var partialMockA = new Mock<ClassA>{CallBase=true};
var stubB = new Mock<ClassB>();
stubB.Setup(b => b.SomeMethod()).Returns(SomeValue);
parialMockA.Setup(a => a.CreateClassB()).Returns(stubB.Object);
var result = partialMock.MethodA();
Assert.AreEqual(someExpectedValue, result);
}
[测试]
公共无效方法A_声明您正在测试_ExpectedResult()
{
var partialMockA=newmock{CallBase=true};
var stubB=newmock();
Setup(b=>b.SomeMethod())。返回(SomeValue);
Setup(a=>a.CreateClassB()).Returns(stubB.Object);
var result=partialMock.MethodA();
AreEqual(someExpectedValue,result);
}
这为您节省了为ClassB创建接口的额外步骤。我认为,在您继承的代码结构不好的情况下,这是合理的,并且ClassB实际上应该分解为几个类和相应的接口(即,不遵循单一责任原则)。我喜欢将此视为重新分解的第一步
此外,假货的另一个替代品是。从未使用过它,但因为它来自Roy Osherove(编写单元测试艺术的人),所以这可能是一个安全的赌注。我只是在想所有我不能做的事情。是的,我绝对做不到。