【发布时间】:2011-03-18 01:45:29
【问题描述】:
我试图断言模拟对象中的属性是使用给定类型设置的。该属性具有抽象类型,并设置为多种具体类型之一。
这就是我正在尝试做的事情,无论 Foo.DoSomething() 设置 Foo.Bar 的值如何,它总是通过测试:
[Test]
public void DoSomething_SetsCorrectBar()
{
// Arrange
Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).
// Act
foo.DoSomething();
// Assert that DoSomething set Foo.Bar to an instance of CorrectBarSubclass
foo.AssertWasCalled(foo => foo.Bar = null, options => options.WhenCalled(invocation => Assert.That(invocation.Arguments[0] is CorrectBarSubclass)));
}
Rhino 3.5 / AAA Documentation 描述了如何对具有给定值的属性集设置期望值,但我只想检查值的类型。
如何断言属性集,特别是具有给定参数类型的属性集?
更新: 上面的例子过于简单了。我实际测试的是一个单独的状态类。这是“父对象”(具有状态的对象,在本例中为 Foo)可以处于的几种状态之一。我正在验证被测状态(称为 BarOne)是否正确地将 Foo.State 设置为 BarTwo 的实例是时候过渡状态了。
一个更清晰的例子(实施了公认的解决方案)是:
[Test]
public void BarOne_DoSomething_SetsNextState()
{
// Arrange
Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).
foo.Stub(x => x.CreateBarTwoState()).Return(new BarTwo(foo));
BarOne bar = new BarOne(foo); // We are testing the BarOne state independently of Foo, that's why we mock Foo but instantiate BarOne.
// Act
bar.DoSomething();
// Assert that DoSomething set Foo.Bar to an instance of BarTwo
foo.AssertWasCalled(foo => foo.Bar = Arg<BarTwo>.Is.TypeOf);
}
【问题讨论】:
-
我理解它只是一个小例子,但期望 Bar 在这里被一个模拟对象调用是没有意义的。能否请您粘贴一个更完整的示例?
-
好点 Grzenio,更新了我上面的问题。
标签: c# unit-testing nunit rhino-mocks