3

我有一个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.Users为空UserController。很明显它没有初始化,WebActivator因为这里没有通过模拟调用 global.asax。现在如何在这种情况下编写一个成功的测试场景,以便WebApicontroller返回带有数据的用户对象?

4

1 回答 1

3

你在使用起订量吗?

因为我看不到该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);
于 2012-12-07T10:24:10.040 回答