1

我有一个简单的要求,但我似乎很挣扎。

我创建了一个stub模拟一个interface,其中包括一个Property

public interface IMockIRuleRuningViewModel : IRuleRunningViewModel
{
    int Id { get; set; }
}

而且mock是:

var mock = MockRepository.GenerateStub<IMockIRuleRuningViewModel>();

现在我想要mock一个我会为此设置一个 setter 的操作,这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).Return(42); 您可以直接使用该属性来达到相同的结果:mockObject.SomeProperty = 42;

4

2 回答 2

3

以下对我有用:

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.GenerateMocknot MockRepository.GenerateStub。我不知道为什么。

于 2012-11-29T12:56:23.950 回答
2

如果您想验证 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();
于 2012-05-22T09:06:20.190 回答