我将使用单元测试项目创建用户注册方法测试。请参考以下代码
[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。
抛出Null Reference异常(图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);
}
}
现在代码遍历Register()
,但它返回结果为NULL
。是因为Mock对象无效吗?我可以在WebApi项目中正确运行整个过程。但是相同的场景在单元测试项目中返回null。
界面IUserManager
public interface IUserManager : IDisposable
{
Task<string> Register(RegisterBindingModel model);
}
答案 0 :(得分:1)
首先,您应该在单独的单元测试类中编写测试用例。抛出第一个错误是因为VS无法运行属于PersonRegistration类的单元测试方法,该类没有公共构造函数。
你在正确的轨道上嘲笑界面。该问题不是由于无效的模拟对象造成的。你应该做的是,按如下方式模拟函数:
mockManager.Setup(it => it.Register(It.IsAny<RegisterBindingModel>()))
.Returns(Task.FromResult(string.Empty));