我有一个依赖于工作单元的 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/