NULL值在UnitTesting中的Mock框架中返回

时间:2017-06-02 05:17:58

标签: c# asp.net-mvc unit-testing mocking moq

我将使用单元测试项目创建用户注册方法测试。请参考以下代码

 [TestClass]
 public class PersonRegistration
  {
    private ILoggingService _loggingService;
    private IUserManager _userManager;
    public PersonRegistration(IUserManager userManager, ILoggingService 
    loggingService)
    {
        this._userManager = userManager;
        this._loggingService = loggingService;
    }

    [TestMethod]
    public void TestMethod1()
    {
        RegisterBindingModel model = new RegisterBindingModel();
        AccountController ac = new AccountController(_userManager, _loggingService);
        model.UserName = "test123@gmail.com";
        var result = ac.Register(model);
        Assert.AreEqual("User Registered Successfully", result);
    }

在上面的代码中,当我运行测试用例文件时,它说

  

无法获取类****的默认构造函数.Test.Controllers.PersonRegistraion

为了克服这个问题,我添加了一个没有任何参数的默认构造函数。第一个问题解决了。但是_userManager_loggingService变为NULL。见图1。

Image 1

抛出Null Reference异常(图2)

Image 2

所以我使用Moq(Using Moq)来填充如下界面。

[TestClass]
public class PersonRegistration
  {
    [TestMethod]
    public void TestMethod1()
    {
        var mockService = new Mock<ILoggingService>();
         var mockManager = new Mock<IUserManager>();
        RegisterBindingModel model = new RegisterBindingModel();
        AccountController ac = new AccountController(mockManager.Object, mockService.Object);
        model.UserName = "test123@gmail.com";
        var result = ac.Register(model);
        Assert.AreEqual("User Registered Successfully", result);
    }
}

Image 3

现在代码遍历Register(),但它返回结果为NULL。是因为Mock对象无效吗?我可以在WebApi项目中正确运行整个过程。但是相同的场景在单元测试项目中返回null。

界面IUserManager

public interface IUserManager : IDisposable
{
 Task<string> Register(RegisterBindingModel model);
}

1 个答案:

答案 0 :(得分:1)

首先,您应该在单独的单元测试类中编写测试用例。抛出第一个错误是因为VS无法运行属于PersonRegistration类的单元测试方法,该类没有公共构造函数。

你在正确的轨道上嘲笑界面。该问题不是由于无效的模拟对象造成的。你应该做的是,按如下方式模拟函数:

mockManager.Setup(it => it.Register(It.IsAny<RegisterBindingModel>()))
           .Returns(Task.FromResult(string.Empty));