使用多个接口模拟 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" });
我正在尝试测试使用两个不同接口的方法。 使用 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" });