gpt4 book ai didi

c# - 使用 Rhino-Mock stub 的排序方法返回值

转载 作者:太空狗 更新时间:2023-10-29 17:47:12 24 4
gpt4 key购买 nike

我在阅读 Roy Osherove 的 单元测试艺术 时开始尝试使用 Rhino-Mocks (3.6)。他有一个示例,演示模拟方法可以编写脚本以在使用相同参数调用两次时返回不同的结果:

   [Test]
public void ReturnResultsFromMock()
{
MockRepository repository = new MockRepository();
IGetRestuls resultGetter = repository.DynamicMock<IGetRestuls>();
using(repository.Record())
{
resultGetter.GetSomeNumber("a");
LastCall.Return(1);

resultGetter.GetSomeNumber("a");
LastCall.Return(2);

resultGetter.GetSomeNumber("b");
LastCall.Return(3);

}

int result = resultGetter.GetSomeNumber("b");
Assert.AreEqual(3, result);

int result2 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(1, result2);

int result3 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(2, result3);
}

这很好用。但是当我尝试用一​​个 stub 和一个接受并返回字符串的方法做同样的事情时,我无法生成第二个返回值:

    [Test]
public void StubMethodWithStringParameter_ScriptTwoResponses_SameResponseReceived()
{
MockRepository mocks = new MockRepository();
IMessageProvider stub = mocks.Stub<IMessageProvider>();

using (mocks.Record())
{
stub.GetMessageForValue("a");
LastCall.Return("First call");
stub.GetMessageForValue("a");
LastCall.Return("Second call");
}

Assert.AreEqual("First call", stub.GetMessageForValue("a"));
Assert.AreEqual("Second call", stub.GetMessageForValue("a"));
}
}

public interface IMessageProvider
{
string GetMessage();
string GetMessageForValue(string value);
}

此测试失败,因为两次调用均收到“First Call”。我已经尝试了一些复杂的语法(使用 mocks.Ordered()、SetResult、Expect 等),但仍然无法让第二个结果出现。

我是不是做错了什么,或者这是 Rhino-Mocks 的限制?我检查过这个 blog post ,但建议的语法没有解决我的问题。

最佳答案

你缺少的一点是告诉 stub 第一个值应该只返回一次:<​​/p>

...
using (mocks.Record())
{
stub.GetMessageForValue("a");
LastCall.Return("First call").Repeat.Once();
stub.GetMessageForValue("a");
LastCall.Return("Second call");
}

当然,您的“Second call”实际上意味着“Second-or-subsequent call”,除非您对 Repeat 施加其他限制。

您还可以考虑使用 RhinoMocks 现在提供的更新的 Arrange、Act、Assert ( AAA) 语法:

[Test]
public void StubMethodWithStringParameter_ScriptTwoResponses_SameResponseReceived()
{
IMessageProvider stub = MockRepository.GenerateStub<IMessageProvider>();

stub.Expect(mp => mp.GetMessageForValue("a"))
.Return("First call")
.Repeat.Once();
stub.Expect(mp => mp.GetMessageForValue("a"))
.Return("Second call");

Assert.AreEqual("First call", stub.GetMessageForValue("a"));
Assert.AreEqual("Second call", stub.GetMessageForValue("a"));
}

它更简洁一些,通常使您不必担心 stub 的记录-回放-断言状态。德里克·贝利 (Derick Bailey) 写了一篇 article about using Repeat在 Los Techies 上。它也恰好使用 AAA 语法)。

关于c# - 使用 Rhino-Mock stub 的排序方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5609589/

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