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

这是代码:

接口(interface) Controller :

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 返回带有数据的用户对象?

最佳答案

您使用的是最小起订量吗?

因为我看不到 UoW.Users 属性是什么类型,所以我无法演示如何正确模拟它(更新的 IRepository),但应该模拟它并 stub 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);

关于unit-testing - 具有工作单元依赖性的模拟 ApiController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13750737/

10-12 06:51