说我有服务:
UserService
它有两种公共方法:
Method1, Method2
我正在测试Method1,但是Method1调用了Method2。
如何模拟(或存根是更正确的单词)对Method2的调用。
如果我模拟UserService,我现在无法实际测试Method1吗?
答案 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,它确实提供了这种粒度。如果您运用自己的程序集,则可以在方法/属性级别而不是在类/接口级别进行模拟。