簡體   English   中英

具有多個接口的模擬類

[英]Mocking class with multiple interfaces

我正在嘗試測試使用兩個不同接口的方法。 使用Moq,我可以配置interfaces方法並設置一個return對象,但是無論我設置為Returns,只是執行的第一個方法都返回值,第二個方法返回null。

這是一個例子:

接口1

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

接口2

public interface ICallApiService
{
    ApiResponseDto ValidateUser();
}

我要測試的課程

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);

}

在使用instance和mock的兩種情況下,我都會遇到相同的錯誤(返回null)。

我想給Moq丟東西嗎?

您正在指示存儲庫模擬程序在輸入參數id的值為1時返回對象。但是服務代碼將使用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 ,因為當您僅對方法進行一次It.IsAny ,您實際上並不關心該值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM