繁体   English   中英

Rhino Mocks:实例化 Mock 属性,以便 Expectation 可以引用它

[英]Rhino Mocks: Instantiating Mock property so Expectation can reference it

我正在使用模拟编写单元测试,但无法成功编写它。 其中一个属性是一个集合,我需要在为模拟设置期望时引用它。 现在期望语句抛出 null。 这是它大致的样子。

IFoo myMock = MockRepository.GenerateMock<IFoo>();
List<Entity> col = new List<Entity>();
Entity entity = new Entity();

myMock.Expect(p => p.FooCollection).Return(col);
myMock.Expect(p => p.FooCollection.Add(entity)); // throws null exception here

我是犀牛模拟的新手,感觉我做的不对。 还有其他方法可以正确实例化集合吗? 可能没有像我上面那样的期望?

更新
我认为我遇到了问题,因为我定义的接口将集合指定为只读。

interface IFoo
{
    List<Entity> FooCollection { get; }
}

我对 Rhino Mocks 并不太熟悉,但我认为在您调用.Replay()之前,您的期望实际上并没有关联 - 您在示例中暗示的 mocking 方法对我来说更像是Moq

就是说,我认为您在这里做的事情根本上是错误的。 你到底想测试什么? p object,还是List<Entity>上的东西? 如果您真正想要测试的是p.YourMethodUnderTest()确实将entity添加到集合中,您可能只想设置p.FooCollection以返回您的列表,然后验证您的列表是否包含实体 object。

// Arrange
IFoo myMock = MockRepository.GenerateMock<IFoo>();
List<Entity> col = new List<Entity>();
Entity entity = new Entity();

myMock.Expect(p => p.FooCollection).Return(col);
// myMock.Expect(p => p.FooCollection.Add(entity)) - skip this

// Act
p.YourMethodUnderTest(entity);

// Assert
Assert.IsTrue(col.Contains(entity)); // Or something like that

您应该使用存根而不是模拟,例如:

IFoo myMock = MockRepository.GenerateStub<IFoo>();
myMock.FooCollection = col;

此外,您将期望设置在真正的 object (collection.Add()) 上,这不会真正起作用。 您可以通过将FooCollection属性类型设置为IList而不是具体的List来解决此问题。

无论如何,使用具体的集合类型作为参数是一种代码味道(我建议使用 FxCop 来教你这些东西)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM