在nunit测试中注射

时间:2011-07-25 07:14:33

标签: .net unit-testing code-injection

我有:

using Ninject;
public class ServiceManager : IServiceHelper
{

   [Inject]
    public IEntityRepository<User, UserCriteria> UserRepository
    {
        get;
        set;
    }

     public User GetUserById(object id)
    {
        User user = UserRepository.GetById(id);

        if (user != null && user.IsHolding.HasValue && user.IsHolding.Value)
            user.Companies = GetAllCompanies().ToList();
        return user;
    }
}

我不会在GetUserById()上写测试。我现在必须做什么,结果它的方法给了我。 请注意,UserCriteria不在我的命名空间中(我无法从我的测试中看到它)UserRepository.GetById(id) - 向数据库发出请求。

1 个答案:

答案 0 :(得分:0)

看起来您需要做的就是为您的UserRepository属性提供一个模拟对象,这样您就不会访问数据库,并且可以提供您想要的任何结果来验证您的GetUserById方法是否正常工作。

例如,使用NSubstitute你可以这样做:

[TestMethod]
public void GetUserByIdDoesSomething()
{
    var userRepository = Substitute.For<IEntityRepository<User, UserCriteria>>();
    //Do something to ensure GetAllCompanies will return a value
    var user = new User();
    userRepository.GetById(Arg.Any<object>()).Returns(user);

    var serviceManager = new ServiceManager();
    serviceManager.UserRepository = userRepository;
    var result = serviceManager.GetUserById(1);
    Assert.AreEqual(user, result);
    Assert.IsTrue(result.Companies.Count() > 0);
}