我在业务层中测试单元测试我的模块有问题。 我正在使用Moq。
来自DL的模块:
namespace EF.BusinessLayer.Modules
{
public class UserModule : IUserModule
{
public User AddUser(User user)
{
using (IUnitOfWork uow = IoC.Resolve<IUnitOfWork>())
{
uow.Add(user);
uow.SaveChanges();
return uow.Queryable<User>().Where(x => x.Username == user.Username).FirstOrDefault();
}
}
}
}
我正在尝试编写测试,我可以测试我的实体是否正确添加。
[TestMethod]
public void AddUserTestMethod()
{
User user = new User()
{
FirstName = "Criss",
LastName = "Johnson",
Username = "CJ",
Email = "email@cj.com"
};
var mockContext = new Mock<IUserModule>();
mockContext.Setup<User>(x => x.AddUser(user)).Callback<User>((c) => User = c);
var result = mockContext.Object.AddUser(user);
}
但结果= null。 我做错了什么?
答案 0 :(得分:1)
让我们了解您的被测系统(SUT)。根据您的描述,我认为它是UserModule
。
请注意,UserModule
取决于IUnitOfWork
,您使用IoC
容器非常正确地依赖注入。
单元测试的关键之一是单独测试SUT。这意味着在UserModule
下测试业务逻辑,你应该嘲笑IUnitOfWork
。这是我在测试中看到的问题。它嘲弄UserModule
本身。
我建议你在调用UserModule的“AddUser”方法之前在你的IoC容器中注册模拟的IUnitOfWork。
[TestMethod]
public void AddUserTestMethod()
{
/*given*/
User expectedUser = new User()
{
FirstName = "Criss",
LastName = "Johnson",
Username = "CJ",
Email = "email@cj.com"
};
var users = new List<User>();
users.Add(expectedUser);
//mock IUnitWork
var mockUnitOfWork= new Mock<IUnitOfWork>();
mockUnitOfWork.Setup(x => x.Add(user));
mockUnitOfWork.Setup(x => x.SaveChanges());
//This may not work as is, could need modification
mockUnitOfWork.Setup(x => x.Queryable<User>()).Returns(users);
//Register mocked unit of work in IoC container
IoC.Register<IUnitOfWork>(mockUnitOfWork.Object);
//Instantiate SUT
var userModule = new UserModule();
/*when*/
var result = userModule.AddUser(user);
/*then*/
//Assert here
}