模拟具有工作单元依赖性的ApiController

时间:2012-12-06 19:08:36

标签: unit-testing mocking nunit asp.net-web-api simple-injector

我有一个Apicontroller,它依赖于工作单元对象。如何编写模拟ApiController的测试用例,它依赖于ApiController构造函数中实现的工作单元。

以下是代码:

ApiController:

public class UserController : ApiController
{
    public IUoW UoW { get; set; }
    // GET api/user
    public UserController(IUoW uow)
    {
        UoW = uow;
    }

    public IEnumerable<Users> Get()
    {
        return UoW.Users.Getall();
    }     
}

测试用例:

[TestMethod]
public void TestApiController()
{
    var userManager = new Mock<IUoW>();
    userManager.Setup(s => s.Users);

    var controller = new UserController(userManager.Object);
    var values = controller.Get();
    Assert.IsNotNull(values);
}

UoW.Users中提到的用户类是

public class UoW:IUoW,IDisposable
{
    private MvcWebApiContext DbContext { get; set; }
    protected IRepositoryProvider RepositoryProvider { get; set; }

    private IRepository<T> GetStandardRepo<T>() where T : class
    {
        return RepositoryProvider.GetRepositoryForEntityType<T>();
    }

    public IRepository<Users> Users
    {
        get { return GetStandardRepo<Users>(); }
    }
}

并且Users类本身是

[Table("UserProfile")]
public class Users
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }


    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }

    [DataType(DataType.PhoneNumber)]
    public long Mobile { get; set; }
}

当我尝试调试测试用例时,测试用例显示对象UoW.UsersUserController中为空。很明显它没有通过WebActivator初始化,因为global.asax不是通过mock调用的。现在如何在此上下文中编写成功的测试场景,以便WebApicontroller返回带有数据的用户对象?

1 个答案:

答案 0 :(得分:3)

你在使用Moq吗?

由于我无法看到UoW.Users属性的类型,我无法演示如何正确模拟它(更新 IRepository)但是应该进行模拟并且GetAll方法存根以返回样本用户列表。

<强>更新

        var userManager = new Mock<IUoW>();

        userManager.Setup(s => s.Users).Returns(()=> 
        { 
            var userReposisitory = new Mock<IRepository<Users>>();

            userReposisitory.Setup(ur => ur.GetAll()).Returns(()=> {
                var listOfUsers = new List<Users>();
                listOfUsers.Add(new Users { FirstName = "Example" });
                return listOfUsers.AsQueryable();
            });

            return userReposisitory.Object; 
        });

        var controller = new UserController(userManager.Object);
        var result = controller.Get();
        Assert.IsNotNull(result);
        Assert.IsTrue(result.Count() > 0);