使用多个接口模拟 class

Mocking class with multiple interfaces

我正在尝试测试使用两个不同接口的方法。 使用 Moq 我配置接口方法并设置一个 return 对象,但是第一个方法执行 returns 值,第二个 returns null,无论我设置什么 Returns.

这是一个例子:

接口 1

public interface IUserRepository
{
    User GetUserById(int id);
}

接口 2

public interface ICallApiService
{
    ApiResponseDto ValidateUser();
}

Class我要测试

public class UserServices : IUserServices
{
    private IUserRepository _userRepository;
    private ICallApiService _callApiService;

    public UserServices(IUserRepository userRepository, ICallApiService callApiService)
    {
        _userRepository = userRepository;
        _callApiService = callApiService;
    }
    public User GetUserById(int id)
    {
        //result always have a value set to result
        var result = _callApiService.ValidateUser();

        //result2 is always null
        var result2 = _userRepository.GetUserById(result.UserId);

        return result2;
    }

}

测试方法

[TestMethod]
public void TestMethod1()
{
    moqUserRepository = new Moq.Mock<IUserRepository>();
    moqUserRepository.Setup(s => s.GetUserById(1)).Returns(new User() { Id = 100, Birth = DateTime.Now, Email = "g@test.com", Name="g" });

    moqCallApiService = new Moq.Mock<ICallApiService>();
    moqCallApiService.Setup(s => s.ValidateUser()).Returns(new ApiResponseDto() { Active = true, Messages = "None", UserId = 100 });


    var userService = new UserServices(moqUserRepository.Object, moqCallApiService.Object);
    var resultInstance = userService.GetUserById(1);

    var moqUserService = new Moq.Mock<UserServices>(moqUserRepository.Object, moqCallApiService.Object).Object;
    var resultMock = moqUserService.GetUserById(1);

}

在使用实例和模拟的两种情况下,我都会得到相同的错误 (return null)。

我是否遗漏了最小起订量?

当输入参数 id 的值为 1 时,您正在指示存储库模拟 return 一个对象。但是服务代码使用 result.UserId 的值调用存储库另一个模拟设置调用将其设置为 100。

将第一个设置调用更改为

moqUserRepository.Setup(s => s.GetUserById(100)).Returns(new User() { Id = 100, Birth = DateTime.Now, Email = "g@test.com", Name="g" });

或使用 It.IsAny,因为当您只对该方法进行一次模拟调用时,您并不真正关心该值:

moqUserRepository.Setup(s => s.GetUserById(It.IsAny<int>())).Returns(new User() { Id = 100, Birth = DateTime.Now, Email = "g@test.com", Name="g" });