我有一个班级
public interface IMyInterface
{
string MethodA();
void MethodB();
}
public class MyClass : IMyInterface
{
public string MethodA()
{
// Do something important
}
public void MethodB()
{
string value = MethodA();
// Do something important
}
}
我想对单元测试方法B进行单元测试,但是在使用Moq仍然调用MethodA
时我无法考虑如何模拟MethodB
。 Moq嘲笑界面,而不是课堂,所以我不能打电话给mock.Object.MethodB()
,对吗?
这可能吗?如果是这样,怎么样?
答案 0 :(得分:4)
我认为不可能。即使有可能我也不愿意这样做。
您正在测试MyClass
的行为,它碰巧实施IMyInterface
与MethodA和MethodB的测试行为有些无关。您可以进行单独的测试,以确保该类实现您希望在必要时实现的接口。 MyClass.MethodB的测试应该在MyClass的实例上完成,而不是在半模拟对象上。
如果您认为MethodA的行为是依赖性,您可以尝试从类中明确地提取它。它将允许测试MethodA(它将简单地委托给依赖项)和MethodB(它将使用依赖项并做更多)。
答案 1 :(得分:1)
模拟依赖关系,你不能容易(或所有)实例化。
MyClass
是被测试的类,所以不应该被嘲笑(你不想测试模拟的值)
但是,如果你有一些MyClass.Foo
属性,类Foo
实现IFoo
接口而MethodA
使用这个Foo
属性,那么你可以模拟它来打破依赖性。