【问题标题】:Mocking ApiController which has Unit of work Dependency模拟具有工作单元依赖关系的 ApiController
【发布时间】:2012-12-06 19:08:35
【问题描述】:

我有一个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。现在如何在这种情况下编写一个成功的测试场景,以便WebApicontroller 向我返回带有数据的用户对象?

【问题讨论】:

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


    【解决方案1】:

    您使用的是起订量吗?

    由于我看不到 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);
    

    【讨论】:

    • 哦,好吧!我的错我会在这里包含用户类。请稍候:)
    • @Joy - 不用担心。答案已更新。附言类名“Users”有点混乱,建议您将其设为单数“User”。
    • 不,userManager.Setup(s =&gt; s.Users).Returns(new Mock&lt;IRepository&lt;Users&gt;&gt;()); userManager.Users.Setup(s =&gt; s.GetAll()).Returns(listOfUsers) 的行在这里没有给出错误。我没有回复,因为那部分留在我的办公室里
    • @Joy - 抱歉,我真的应该测试我的代码,但上次回答很匆忙。现已更新并确认可以使用。
    • Assert.That 必须更改,因为我使用的是内置的 UnitTesting 库。另一个问题是它不能在return listOfUsers.ToList(); 处隐式转换Generic.List&lt;Users&gt; to IQueryable&lt;Users&gt;
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多