C# Rhino Mocks,设置存根属性后如何执行操作

C# Rhino Mocks,设置存根属性后如何执行操作,c#,unit-testing,mocking,rhino-mocks,C#,Unit Testing,Mocking,Rhino Mocks,我有一个简单的要求,但我似乎在挣扎 我创建了一个存根,它模拟包含属性的接口: public interface IMockIRuleRuningViewModel : IRuleRunningViewModel { int Id { get; set; } } 而模拟的mock是: var mock = MockRepository.GenerateStub<IMockIRuleRuningViewModel>(); 但我一直收到这个异常: 您正在尝试对定义为使用Prop

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

我创建了一个
存根
,它模拟包含
属性的
接口

public interface IMockIRuleRuningViewModel : IRuleRunningViewModel
{
    int Id { get; set; }
}
而模拟的
mock
是:

var mock = MockRepository.GenerateStub<IMockIRuleRuningViewModel>();
但我一直收到这个
异常

您正在尝试对定义为使用PropertyBehavior的属性设置期望。 而不是编写这样的代码:mockObject.Stub(x=>x.SomeProperty).Return(42); 您可以直接使用该属性来获得相同的结果:mockObject.SomeProperty=42


如果您想要验证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();
//排列
var model=MockRepository.GenerateMock();
Expect(m=>m.ProcessEngineResults(42));
RulesEngine发动机=新的RulesEngine(型号);
//表演
引擎运行规则(“Id”);
//断言
model.verifyallexpections();

如果要验证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();
//排列
var model=MockRepository.GenerateMock();
Expect(m=>m.ProcessEngineResults(42));
RulesEngine发动机=新的RulesEngine(型号);
//表演
引擎运行规则(“Id”);
//断言
model.verifyallexpections();

以下内容对我很有用:

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");
  });

您必须使用
MockRepository.GenerateMock
而不是
MockRepository.GenerateStub
。我不知道为什么。

以下内容适合我:

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");
  });

您必须使用
MockRepository.GenerateMock
而不是
MockRepository.GenerateStub
。我不知道为什么。

你可能想要
GenerateMock
而不是
generateSub
。那么你想在设置Id属性时执行代码吗?是的,我确实想执行setterGenerateMock中的代码不起作用。当我设置属性时,什么都没有发生(它甚至没有设置属性-值保持为0)想要在模拟/存根对象的setter中执行代码的用例是什么?通常,存根/模拟是依赖项的简单替代项或占位符。如果您有需要在setter上执行的代码,那么这应该是实现接口的对象的单元测试的一部分。您可能希望
GenerateMock
而不是
GenerateStub
。因此,您希望在设置Id属性时执行代码?是的,我确实希望在setterGenerateMock中执行代码不起作用。当我设置属性时,什么都没有发生(它甚至没有设置属性-值保持为0)想要在模拟/存根对象的setter中执行代码的用例是什么?通常,存根/模拟是依赖项的简单替代项或占位符。如果您有需要在setter上执行的代码,那么这应该是实现接口的对象的单元测试的一部分。