Moq如何测试BusinessLayer

时间:2014-10-14 14:42:12

标签: moq

我在业务层中测试单元测试我的模块有问题。 我正在使用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。 我做错了什么?

1 个答案:

答案 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
}