我必须测试处理给定事件的投影并将其保存在只读Mongo数据库上(我使用官方c#Mongo驱动程序):
public class MyObjectProjection : IHandleMessages<RegisteredEvent>
{
private MongoCollection<MyObjectView> _collection;
private MyObjectView item;
public MyObjectProjection (MongoDatabase db)
{
_collection = db.GetCollection<MyObjectView>("my-object");
}
public void Handle(RegisteredEvent message)
{
item = new MyObjectView();
item.Id = message.Id;
// some code omitted
_collection.Save(item);
}
}
我需要对Handle
方法进行单元测试,因为:
我应该使用替代解决方案而不是反射或友好组装吗?在这种情况下,最佳做法是什么? 现在我的测试看起来像这样:
[TestMethod]
public void TestMethod1()
{
// ARRANGE - some code omitted
databaseMock
.Setup(x => x.GetCollection<MyObjectView>(It.IsAny<string>()))
.Returns(collection);
collectionMock
.Setup(x => x.Save(It.IsAny<MyObjectView>()))
.Returns(It.IsAny<WriteConcernResult>);
// ACT
var handler = new MyObjectProjection(database);
handler.Handle(evt);
// ASSERT
// nothin' to assert here!
}
这样可行,但是当Handle
方法完成时我没有任何断言。
答案 0 :(得分:0)
嗯,您的Handle()
方法通过调用Save()
方法与集合进行交互。因此,您可以预期传递给Handle方法的元素具有正确的ID集:
collectionMock.Verify(x=>x.Save(It.Is<MyObjectView>(v => v.Id == 5)), Times.Once,"save should be called with object with Id = 5");
我在这里假设传递给evt
的{{1}}和Id为5.代码未经过测试,但我认为类似的东西可以解决问题。
答案 1 :(得分:0)
在这种情况下,最佳做法是什么?
最佳做法是让会员可见。是否有任何特殊原因需要隐藏成员?
然后,您可以断言传递给Save
方法的参数:
MyObjectView objectView;
collectionMock
.Setup(x => x.Save(It.IsAny<MyObjectView>()))
.Callback<MyObjectView>((obj) => objectView= obj)
.Returns(It.IsAny<WriteConcernResult>);
Assert.That(objectView.Id, Is.EqualTo(evt.Id));
//assert other properties