如何模拟和期望将动作委托作为Moq参数之一的方法

时间:2018-12-06 10:39:39

标签: asp.net-core moq xunit

我正在.net核心应用程序中使用Automapper进行映射。我有下面的方法

public MyEntity TransformtoToEntity(MyDTO dto)
        {
            var entity = _mapper.Map<MyEntity, MyDTO>(dto, opts => opts.Items["isUpdate"] = "N");

            return entity;
        } 

我的测试方法看起来像

    [Fact]
            public void Returns_Data_After_Mapping()
            {
                // Arrange
                var mockEntityData = new MyEntity
                {
                    Id = 1,
                    Name = "John"

                };
var mockDto = new MyDTO
            {
                Id = 1,
Name = "John"
            };
                var mappingOperationMock = new Mock<IMappingOperationOptions<MyDTO, MyEntity>>(MockBehavior.Strict);
                mappingOperationMock.Setup(x => x.Items).Returns(new Dictionary<string, object>() { { "isUpdate", "N" }});

                _mapper.Setup(x => x.Map(It.IsAny<MyDTO>(), 
                    It.IsAny<Action<IMappingOperationOptions<MyDTO, MyEntity>>>()))
                   .Returns(mockEntityData);

                // Act
                var result = _myMapper.TransformDtoToEntity(mockDto);

                // Assert
                Assert.NotNull(result);

                _mapper.VerifyAll();
                mappingOperationMock.VerifyAll();
            }

在这里,我如何验证IMappingOperationOptions参数是否正确传递。还是有更好的方法在这里进行单元测试。基本上,我坚持如何有效地对具有Action委托参数的方法进行单元测试。我引用了线程Testing a method accepting a delegate with Moq,但是在回调中找不到我可以断言或验证的任何内容。

1 个答案:

答案 0 :(得分:0)

如果您想测试操作委托中发生的情况,可以使用moq中的回调。

类似

Action<IMappingOperationOptions<MyEntity, MyDto>> mappingOperationAction = default;

_mapper.setup(x.Map(myDto, It.IsAny<Action<IMappingOperationOptions<MyEntity,MyDto>>>())
       .callBack<MyDto, Action<IMappingOperationOptions<MyEntity,MyDto>>>( (callbackMyDto, callbackMappingOperationAction) => mappingOperationAction = callbackMappingOperationAction);

var mappingOperation = new MappingOperationOptions<MyEntity, MyDto>(_ => default);

mappingOperationAction.Invoke(mappingOperation);

Assert.AreEqual("N", mappingOperation.Items["isUpdate"])