gpt4 book ai didi

c# - 如何通过 RhinoMocks 中的指定条件从方法返回值?

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

如何使用 RhinoMocks 模拟以下行为?

被测试的方法在接口(interface)上调用 ReceivePayment 方法。

public void TestedMethod(){
bool result = interface.ReceivePayment();
}

接口(interface)有 CashAccepted 事件。如果此事件已被多次调用(或由条件调用),则 ReceivePayment 应返回 true。

如何完成这样的任务?

更新。

现在我执行以下操作:

UpayError error;
paymentSysProvider.Stub(i => i.ReceivePayment(ticketPrice,
App.Config.SellingMode.MaxOverpayment, uint.MaxValue, out error))
.Do( new ReceivePaymentDel(ReceivePayment));

paymentSysProvider.Stub(x => x.GetPayedSum()).Return(ticketPrice);

session.StartCashReceiving(ticketPrice);

paymentSysProvider.Raise(x => x.CashInEvent += null, cashInEventArgs);

public delegate bool ReceivePaymentDel(uint quantityToReceive, uint maxChange, uint maxTimeout, out UpayError error);
public bool ReceivePayment(uint quantityToReceive, uint maxChange, uint maxTimeout, out UpayError error) {
Thread.Sleep(5000);
error = null;
return true;
}

StartCashReceiving 立即返回,因为里面有任务启动。但是下一行:paymentSysProvider.Raise(...) 正在等待 ReceivePayment stub 的完成!

最佳答案

您可以使用WhenCalled。其实我不明白你的问题(事件是由模拟触发的还是被测单元触发的?谁在处理事件?)

有一些示例代码:

bool fired = false;

// set a boolean when the event is fired.
eventHandler.Stub(x => x.Invoke(args)).WhenCalled(call => fired = true);

// dynamically return whether the eventhad been fired before.
mock
.Stub(x => x.ReceivePayment())
.WhenCalled(call => call.ReturnValue = fired)
// make rhino validation happy, the value is overwritten by WhenCalled
.Return(false);

当您在测试中触发事件时,您还可以在触发后重新配置模拟:

mock
.Stub(x => x.ReceivePayment())
.Return(false);

paymentSysProvider.Raise(x => x.CashInEvent += null, cashInEventArgs);

mock
.Stub(x => x.ReceivePayment())
.Return(true)
.Repeat.Any(); // override previous return value.

关于c# - 如何通过 RhinoMocks 中的指定条件从方法返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702484/

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