使用Moq模拟一个类而不是整个类的一个方法?

时间:2012-07-28 00:11:33

标签: c# .net unit-testing moq

我有一个班级

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(),对吗?

这可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:4)

我认为不可能。即使有可能我也不愿意这样做。

您正在测试MyClass的行为,它碰巧实施IMyInterface 与MethodA和MethodB的测试行为有些无关。您可以进行单独的测试,以确保该类实现您希望在必要时实现的接口。 MyClass.MethodB的测试应该在MyClass的实例上完成,而不是在半模拟对象上。

如果您认为MethodA的行为是依赖性,您可以尝试从类中明确地提取它。它将允许测试MethodA(它将简单地委托给依赖项)和MethodB(它将使用依赖项并做更多)。

答案 1 :(得分:1)

模拟依赖关系,你不能容易(或所有)实例化。
MyClass是被测试的类,所以不应该被嘲笑(你不想测试模拟的值) 但是,如果你有一些MyClass.Foo属性,类Foo实现IFoo接口而MethodA使用这个Foo属性,那么你可以模拟它来打破依赖性。