犀牛嘲笑,设置存根属性后如何执行操作
本文关键字:何执行 执行 操作 设置 属性 存根 犀牛 | 更新日期: 2023-09-27 18:34:54
我有一个简单的要求,但我似乎在挣扎。
我创建了一个stub
来模拟包含Property
的interface
:
public interface IMockIRuleRuningViewModel : IRuleRunningViewModel
{
int Id { get; set; }
}
mock
是:
var mock = MockRepository.GenerateStub<IMockIRuleRuningViewModel>();
现在我想mock
一个我会为这个Property
放入二传手的动作,这是我的尝试:
mock.Stub(x => x.Id).WhenCalled(
o =>
{
var engine = new RulesEngine(mock);
mock.ProcessRuleEngineResults(engine.RunRule("Id"));
});
但我不断得到这个Exception
:
您正在尝试对定义为使用 PropertyBehavior 的属性设置期望。 而不是编写这样的代码:mockObject.Stub(x => x.SomeProperty(。返回(42(; 您可以直接使用该属性来实现相同的结果:mockObject.SomeProperty = 42;
以下内容对我有用:
HttpResponseBase response = MockRepository.GenerateMock<HttpResponseBase>();
// stub the getter
response.Stub(r => r.StatusCode).Return((int)HttpStatusCode.OK);
// Stub the setter
response.Stub(r => r.StatusCode = Arg<int>.Is.Anything).WhenCalled( o =>
{
Console.WriteLine("called");
});
由于我实际上要做的是模拟您可以获取但不设置状态代码的情况(因为标头已经发送(,所以我不做WhenCalled()
,我这样做:
response.Stub(r => r.StatusCode = Arg<int>.Is.Anything)
.Throw(new HttpException("Server cannot set status after HTTP headers have been sent"));
你必须使用MockRepository.GenerateMock
而不是MockRepository.GenerateStub
.我不知道为什么。
如果要验证 SUT(受测系统(的行为,则应使用具有适当期望的模拟,并验证这一点。如果只想传递可能需要以某种方式执行操作的值,但不是此测试的重点,则将使用存根(存根不会导致测试失败(。
我假设您正在此测试中测试RulesEngine
(因为它只是我看到的真实对象(。下面是一个示例测试,用于验证执行"Id"规则时引擎的行为:
// Arrange
var model = MockRepository.GenerateMock<IMockIRuleRuningViewModel>();
model.Expect(m => m.ProcessEngineResults(42));
RulesEngine engine = new RulesEngine(model);
// Act
engine.RunRule("Id");
// Assert
model.VerifyAllExpectations();