如何编写测试 AutoMapper 是否使用正确的操作选项调用的测试

How to write a test that tests that AutoMapper is called with the correct operation options

我有这段代码,想测试 opts.Items["foo"] 是否设置正确。

public Result DoStuff(MyInput myObj)
{
    var mapped = _mapper.Map<Result>(myObj,
        opts =>
        {
            opts.Items["foo"] = "bar";
        });
    return mapped;
} 

我的测试是这样的

public void MapperShouldBeCalledWithCorrectOperationItems()
{
    // Arrange
    var optObj = Substitute.For<IMappingOperationOptions>();
    Action<IMappingOperationOptions> argumentUsed = null;
    _mapper.Received().Map<Result>(result, Arg.Do<Action<IMappingOperationOptions>>(arg => argumentUsed = arg));

    // Act
    _uut.DoStuff(new MyInput());
    argumentUsed.Invoke(optObj);

    // Assert
    optObj.Items["foo"].Should().Be("bar");
}

现在这行不通了,我什至不确定我是否走在正确的道路上:(

我认为我无法检查 lambda,所以我必须检查 IMappingOperationOptions 是否设置了 Items["foo"]

有什么建议吗?

我想通了!

public void MapperShouldBeCalledWithCorrectOperationItems()
{
    // Arrange
    var optObj = Substitute.For<IMappingOperationOptions>();

    Action<IMappingOperationOptions> argumentUsed = null;
    _mapper
        .Map<Result>(Arg.Any<Result>,
                     Arg.Do<Action<IMappingOperationOptions>>(arg => argumentUsed = arg));

    // Act
    _uut.DoStuff(new MyInput());
    argumentUsed.Invoke(optObj);

    // Assert
    optObj.Items["foo"].Should().Be("bar");
}