如何模拟和期望使用Action委托作为Moq参数之一的方法

问题描述 投票:0回答:1

我正在.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,但找不到在回调中可以断言或验证的任何内容。

asp.net-core moq xunit
1个回答
0
投票

如果您想测试动作委托中发生的事情,可以使用最小起订量的回调。

类似

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"])
© www.soinside.com 2019 - 2024. All rights reserved.