Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF/.NET:我不能用假模拟完全替换具体类吗?_C#_.net_Wpf_Unit Testing_Moq - Fatal编程技术网

C# WPF/.NET:我不能用假模拟完全替换具体类吗?

C# WPF/.NET:我不能用假模拟完全替换具体类吗?,c#,.net,wpf,unit-testing,moq,C#,.net,Wpf,Unit Testing,Moq,我有一个大型的遗留WPF应用程序,它没有进行单元测试,到处都有大量的依赖关系。我试图使用Moq来创建单元测试,但这对我没有多大帮助,因为太多(=几乎所有)类在内部创建依赖项,所以我无法注入模拟对象而不是真正的引用 在C++中,你可以编写自己的冒牌类,并确保它们在测试项目中的真实对象之前被包含在-> >方式>强>所有引用< /强>中,可以在整个项目中引用假对象,包括所有内部引用。 在.NET中是否没有办法实现同样的功能 提前感谢您的建议 -塞波 另外,这是对前面一个问题的跟进。应该做您希望它做的事

我有一个大型的遗留WPF应用程序,它没有进行单元测试,到处都有大量的依赖关系。我试图使用Moq来创建单元测试,但这对我没有多大帮助,因为太多(=几乎所有)类在内部创建依赖项,所以我无法注入模拟对象而不是真正的引用

<>在C++中,你可以编写自己的冒牌类,并确保它们在测试项目中的真实对象之前被包含在-> >方式>强>所有引用< /强>中,可以在整个项目中引用假对象,包括所有内部引用。 在.NET中是否没有办法实现同样的功能

提前感谢您的建议

-塞波

另外,这是对前面一个问题的跟进。

应该做您希望它做的事情,但它仅在Visual Studio Ultimate和Premium上可用

除了MS Fakes/Shimes,C#开箱即用(或我知道的任何免费库)中没有任何东西可以满足您的需要。

您可以使用“部分模拟”。假设您的类A在A中内部创建了类B的实例,例如私有方法

您可以将新的ClassB()移动到工厂方法
受保护的虚拟
方法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(编写单元测试艺术的人),所以这可能是一个安全的赌注。

我只是在想所有我不能做的事情。是的,我绝对做不到。