public Class Test{
GetDataset(RandomBoolean uncertain);
GetDataset2();
GetDataset3();
}
方法定义
public virtual void GetDataset2(){}
public virtual void GetDataset3(){}
public virtual void GetDataset(RandomBoolean uncertain)
{
if (uncertain.State){
GetDataset2();
}
else{
GetDataset3();
}
}
//mocking uncertain.State to return true
//ACT
testObject.GetDataset(uncertainMock);
我想测试当我在testObject.GetDataset()上行动时是否在内部调用GetDataset2(); 我不是在嘲笑testObject,因为它是测试对象,所以如果我尝试
testObject.AssertWasCalled(x => x.GetDataset2());
它不会让我这样做,因为testObject不是一个模拟对象。 我正在使用Rhino Mocks 3.5,我肯定在这里遗漏了一些东西。 实现这一目标的最佳方法是什么。
答案 0 :(得分:3)
简短的回答是:你做不到。另一方面,你通常不想这样做。当您对该类进行单元测试时,您需要确保该类正确地进行计算并且它具有正确的副作用。您不应该测试类的内部,因为这会导致实际代码和测试的耦合太强。这个想法是你可以自由地改变你的类的实现,并使用你的测试来确保它仍然正常工作。如果您的测试检查内部状态或流程,您将无法执行此操作。
您有2个选项(取决于具体情况)
答案 1 :(得分:0)
这通常不是如何使用模拟器进行单元测试的。
您应该关注协作者(您存根/模拟)和结果(void
方法的状态更改),而不是被测系统的内部工作(尽管有合作者的调用)
这既是因为也是为什么你不能做出那些类型的行为观察(至少不是在没有改变你的类来适应测试,通过暴露私人成员或添加状态揭示成员 - 不是好主意)。
答案 2 :(得分:0)
有一些关于部分嘲笑here的信息。以下是关于如何使用RhinoMocks和Moq进行此操作的code snippets。
试试这个:
using Rhino.Mocks;
public class TestTest {
[Test]
public void FooTest()
{
var mock = new MockRepository().PartialMock<Test>();
mock.Expect(t => t.GetDataset2());
mock.GetDataset((RandomBoolean)null);
}
}
答案 3 :(得分:0)
除了通过Rhino Mocks使用部分模拟之外,您还可以创建从Test派生的类,该类用一个记录它的函数替换GetDataSet2()的实现。然后在测试中检查一下。
这是一种代码气味,但你在一堂课中做得太多了。