如何在服务上测试方法,同时在同一服务上模拟另一个方法?

时间:2011-11-08 17:23:19

标签: c# moq

说我有服务:

UserService

它有两种公共方法:

Method1, Method2

我正在测试Method1,但是Method1调用了Method2。

如何模拟(或存根是更正确的单词)对Method2的调用。

如果我模拟UserService,我现在无法实际测试Method1吗?

4 个答案:

答案 0 :(得分:3)

除非您通过引入抽象/接口来削弱这些方法之间的耦合,否则无法做到这一点。您当前的UserService实现意味着Method1和Method2之间存在强大的耦合。

答案 1 :(得分:2)

如果我正确理解您的问题,您可以使用CallBase

  

如果没有期望覆盖成员(在Rhino Mocks中的a.k.a.“Partial Mocks”),则调用基类实现

使用CallBase = true创建模拟,设置Method2以返回您要测试的任何值,然后调用Method1

举个例子:

class Program
{
    static void Main(string[] args)
    {
        var mock = new Mock<UserService> { CallBase = true };
        mock.Setup(m => m.Method2()).Returns("Mock 2");

        Console.WriteLine(mock.Object.Method1());
        Console.ReadLine();
    }
}

public class UserService
{
    public virtual string Method1()
    {
        return "Method 1 :: " + Method2();
    }

    public virtual string Method2()
    {
        return "Method 2";
    }
}

答案 2 :(得分:0)

我仍然在努力解决这个问题,“应该我嘲笑对Method2的调用?”我倾向于说,“不。”如果类内部使用两种方法作为其逻辑的一部分,则两者都是测试的一部分。模拟是针对UserService的依赖,而不是内部实现细节。

简而言之,虽然我不知道任何可以做到这一点的嘲弄工具,但我认为不应该首先完成。

答案 3 :(得分:0)

你不能与Moq合作。您可以考虑使用Moles,它确实提供了这种粒度。如果您运用自己的程序集,则可以在方法/属性级别而不是在类/接口级别进行模拟。