gpt4 book ai didi

c# - 犀牛模拟 : AAA Synax: Assert property was set with a given type

转载 作者:行者123 更新时间:2023-11-30 20:10:13 26 4
gpt4 key购买 nike

我试图断言模拟对象中的属性设置为给定类型。该属性具有抽象类型,并设置为多种具体类型之一。

这就是我想要做的,无论 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);
}

最佳答案

也许是这样的:

[Test]
public void AddPlayer_GivesGameEnoughPlayersToStart_SetsNextState()
{
// Arrange
Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).
foo.Expect(m => m.Bar = Arg<CorrectBarSubclass>.Is.TypeOf);
// Act
foo.DoSomething();
//Assert
foo.VerifyAllExpectations();
}

所以这是怎么回事..

我们将断言更改为 Expect。我发现这有点简洁,而且期望让我们能够更清晰地验证类型是什么。我们说“期望 Bar 将被设置为 CorrectBarSubclass 的实例。然后我们采取行动,并断言我们的期望得到满足。

一些事情:任何时候你 Mock 一个类,任何你有 ExpectStub 调用的东西都必须是虚拟的或抽象的,所以在这种情况下,Bar 必须是虚拟的。通常最好模拟一个接口(interface)并测试一个类如何使用依赖项,而不是测试一个类如何使用自身(这通常表明过度测试或不正确的关注点分离)。

在您的情况下,甚至需要模拟吗?您只是使用了一种有点复杂的语法来断言真实行为的结果,除了属性的 setter 之外,没有什么是真正模拟的。有时测试真实行为更容易,也更合适。为什么不做这样的事情:

var foo = new Foo();
foo.DoSomething();
Assert.That(foo.Bar is CorrectBarSubclass);

关于c# - 犀牛模拟 : AAA Synax: Assert property was set with a given type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com