Rhino Mock Expect.Call() 实际上调用的方法不仅创建了一个期望
Rhino Mock Expect.Call() actually calls the method not only create an expectation
我想测试在测试中是否调用了某个方法
我的问题是,当我想要创造期望时,它并没有像我想的那样工作。下一行实际运行该方法,不仅创建了一个期望:
Expect.Call(() => mockedService.MethodThatIExpectToRun(params));
还有一个方法:
mockedService.Expect((s=> s.MethodThatIExpectToRun(params)));
但这实际上也运行了该方法,不仅创建了要通过测试实现的期望。
而断言方法是否未被调用的这一行实际上也调用了该方法,不仅检查它是否被调用。
mockedService.AssertWasCalled(s=> s.MethodThatIExpectToRun((params)));
补充信息:
MethodThatIExpectToRun
returns void
对于 prgmtc 的评论:
IService mockedService = MockRepository.GeneratePartialMock<Service>(mockedRepository_1, ..., mockedRepository_n);
一个更一般的(尽管可能不太有用)的评论:部分模拟可以指向被测代码的设计味道。如果你只想为class的一部分提供期望,那么也许那个class的职责太多,应该拆分成多个class?这样你就可以干净地隔离 responsibilities/collaborators 并且不需要 partialmock 构造。如果您模拟(不是部分模拟)具体的接口或虚拟成员 class,则调用将不会进入实际实现。
例如:
Console.WriteLine("Real object: ");
new Foo().Bar();
Console.WriteLine("Mocked object: ");
var aFoo = MockRepository.GenerateMock<Foo>();
aFoo.Expect(f => f.Bar());
aFoo.Bar();
...
public class Foo
{
public virtual void Bar()
{
Console.WriteLine("REAL IMPLEMENTATION");
}
}
输出:
Real object:
REAL IMPLEMENTATION
Mocked object:
通常当你有 PartialMock
在设置 Stub
或 Expect
时调用真正的方法,这意味着方法中缺少 virtual
关键字。
确保 Service.MethodThatIExpectToRun
是 virtual
。
我想测试在测试中是否调用了某个方法
我的问题是,当我想要创造期望时,它并没有像我想的那样工作。下一行实际运行该方法,不仅创建了一个期望:
Expect.Call(() => mockedService.MethodThatIExpectToRun(params));
还有一个方法:
mockedService.Expect((s=> s.MethodThatIExpectToRun(params)));
但这实际上也运行了该方法,不仅创建了要通过测试实现的期望。
而断言方法是否未被调用的这一行实际上也调用了该方法,不仅检查它是否被调用。
mockedService.AssertWasCalled(s=> s.MethodThatIExpectToRun((params)));
补充信息:
MethodThatIExpectToRun
returns void
对于 prgmtc 的评论:
IService mockedService = MockRepository.GeneratePartialMock<Service>(mockedRepository_1, ..., mockedRepository_n);
一个更一般的(尽管可能不太有用)的评论:部分模拟可以指向被测代码的设计味道。如果你只想为class的一部分提供期望,那么也许那个class的职责太多,应该拆分成多个class?这样你就可以干净地隔离 responsibilities/collaborators 并且不需要 partialmock 构造。如果您模拟(不是部分模拟)具体的接口或虚拟成员 class,则调用将不会进入实际实现。
例如:
Console.WriteLine("Real object: ");
new Foo().Bar();
Console.WriteLine("Mocked object: ");
var aFoo = MockRepository.GenerateMock<Foo>();
aFoo.Expect(f => f.Bar());
aFoo.Bar();
...
public class Foo
{
public virtual void Bar()
{
Console.WriteLine("REAL IMPLEMENTATION");
}
}
输出:
Real object:
REAL IMPLEMENTATION
Mocked object:
通常当你有 PartialMock
在设置 Stub
或 Expect
时调用真正的方法,这意味着方法中缺少 virtual
关键字。
确保 Service.MethodThatIExpectToRun
是 virtual
。