Autofac.Extras.Moq - 来自模拟登录的响应不包含预期值

Autofac.Extras.Moq - response from mocked Login does not contain expected value

我想在我的应用程序中进行单元测试。我使用 NUNIT 和以下库:

我遵循了这个示例,但它不起作用:

这是我的测试:

private Fixture _fixture;

[SetUp]
public void Setup()
{
   _fixture = new Fixture();
}

[Test]
public void Login_Success()
{
   using (var mock = AutoMock.GetLoose())
   {
      var infosLogin = _fixture.Create<LoginRequest>();
      var loginResponse = _fixture.Create<LoginResponse>();

      var userService = mock.Mock<IUserService>();
      userService
         .Setup(user => user.Login(infosLogin))
         .Returns(Task.FromResult(loginResponse));

      var viewModel = new MainPageViewModel(new ContentPage(), userService.Object);

      viewModel.Login = infosLogin.Username;
      viewModel.Password = infosLogin.Password;
      viewModel.LoginCommand.Execute(null);
   }
}

我的观点

public MainPage()
{
   InitializeComponent();
   BindingContext = new MainPageViewModel(this, new UserServiceImpl());
}

我的视图模型

public MainPageViewModel(Page page, IUserService userService)
{
   _page = page;
   _userService = userService;

   Login = "";
   Password = "";
}

public Command LoginCommand
{
   get
   {
      return new Command(async () =>
      {
         Console.WriteLine("step 1...");

         if (!string.IsNullOrEmpty(Login) && !string.IsNullOrEmpty(Password))
         {
            Console.WriteLine("step 2...");
            var infos = new LoginRequest() { Username = "Wyllis", Password = "test" };
            LoginResponse response = await _userService.Login(infos);
            Console.WriteLine("step 3...");
            Console.WriteLine(response);
            Age = response.Age; // Got error : Object reference not set to an instance of an object
         }
      });
   }
}

登录响应模型

public class LoginResponse
{
   public string Username { get; set; }
   public string Age { get; set; }
}

Age = response.Age;,我收到错误:未将对象引用设置到对象的实例,您能解释一下错在哪里吗?

我找到了解决方案,new LoginRequest(...) 我的视图模型和我的测试是相同的,但是哈希码(内存地址)不同,所以我的测试失败了,因为我的参数不是具有相同内存的同一个对象视图模型

这是我的新测试和我的视图模型

视图模型

public Command LoginCommand
{
   get
   {
      return new Command(async () =>
      {
         if (!string.IsNullOrEmpty(Login) && !string.IsNullOrEmpty(Password))
         {
            var infos = new LoginRequest() { Username = Login, Password = Password };
            LoginResponse response = await _userService.Login(infos);

            Age = response.Age;
         }
      });
   }
}

测试

private Mock<IUserService> _userService;
private MainPageViewModel _viewModel;
private Fixture _fixture;

[SetUp]
public void Setup()
{
            using (var mock = AutoMock.GetLoose())
            {
                _userService = mock.Mock<IUserService>();
            }
            _fixture = new Fixture();
        }

        private MainPageViewModel CreateInstance()
        {
            return new MainPageViewModel(_userService.Object);
        }

        [Test]
        public void Test_Constructor()
        {
            using (var mock = AutoMock.GetLoose())
            {
                var viewModel = mock.Create<MainPageViewModel>();

                viewModel.Login.Equals("");
                viewModel.Password.Equals("");
            }
        }

        [Test]
        public void Login_Success()
        {
            var user = _fixture.Create<LoginResponse>();

            _viewModel = CreateInstance();
            _viewModel.Login = "test";
            _viewModel.Password = "test";

            _userService
                .Setup(s => s.Login(It.IsAny<LoginRequest>()))
                .Returns(Task.FromResult(user))
                .Verifiable();

            _viewModel.LoginCommand.Execute(null);

            _userService.Verify();

            Assert.AreEqual(_viewModel.Age, user.Age);
        }