隐藏成员时映射的单元测试
Unit test of a mapping when members are hidden
我必须测试处理给定事件的投影并将其保存在只读 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
方法完成时我没有什么可断言的。
嗯,您的 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");
我在这里假设传递给 Handle()
的 evt
的 ID 为 5。代码未经过测试,但我认为类似的东西可以解决问题。
What is the best practice in a case like this?
最佳做法是让成员可见。您有什么特殊原因需要隐藏成员吗?
然后,您可以针对传递给 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
我必须测试处理给定事件的投影并将其保存在只读 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
方法完成时我没有什么可断言的。
嗯,您的 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");
我在这里假设传递给 Handle()
的 evt
的 ID 为 5。代码未经过测试,但我认为类似的东西可以解决问题。
What is the best practice in a case like this?
最佳做法是让成员可见。您有什么特殊原因需要隐藏成员吗?
然后,您可以针对传递给 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