gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:39:55 25 4
gpt4 key购买 nike

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

代码如下:

API 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.UsersUserController 中为 null。很明显它不是通过 WebActivator 初始化的,因为这里没有通过模拟调用 global.asax。现在如何在此上下文中编写成功的测试场景,以便 WebApicontroller 返回带有数据的用户对象?

最佳答案

你在使用 Moq 吗?

因为我看不到 UoW.Users 属性是什么类型,所以我无法演示如何正确模拟它(已更新 IRepository),但应该模拟它和 GetAll 方法 stub 以返回用户示例列表。

已更新

        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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com