9

我有一堂课

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
    }
}

我想对 MethodB 进行单元测试,但在考虑如何MethodA在仍然调用MethodBMoq 的同时进行 Mock 时遇到了麻烦。Moq 模拟接口,而不是类,所以我不能只调用mock.Object.MethodB(),对吗?

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

4

2 回答 2

4

我不认为这是可能的。即使有可能我宁愿不这样做。

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

如果您认为 MethodA 的行为是依赖关系,您可以尝试从类中显式地提取它。它将允许测试 MethodA(它将简单地委托给依赖项)和 MethodB(它将使用依赖项并执行更多操作)。

于 2012-07-28T00:45:51.637 回答
1

模拟你不能轻易(或全部)实例化的依赖项。
MyClass是正在测试的类,所以不应该被模拟(你不想测试模拟值)。
但是,如果您有一些MyClass.Foo属性是Foo实现IFoo接口并MethodA使用此Foo属性的类,那么您可以模拟它以打破依赖关系。

于 2012-07-30T16:07:52.253 回答