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

时间:2015-09-25 16:11:23

标签: c# mongodb unit-testing moq

我必须测试处理给定事件的投影并将其保存在只读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方法完成时我没有任何断言。

2 个答案:

答案 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