隐藏成员时映射的单元测试

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