我正在开发一个ASP。. NET MVC项目。在我的项目中,我正在做单元测试。我使用Moq进行单元测试。但是我在测试一个依赖于它的另一个函数的模型类的方法时遇到了一个问题。
这是我要测试的模型类的示例
public class ItemRepo:IItemRepo
{
private DbContext context = new DbContext();
public IEnumerable<Item> GetItems()
{
return context.items;
}
public string GenerateItemCode()
{
Item item = this.GetItems.OrderByDescending(x=>x.Id).FirstOrDefault();
//do something
return itemCode;
}
}
我想测试GenerateItemCode方法
[TestClass]
public class ItemRepoTests
{
[TestMethod]
public void GenerateItemCode_IncreaseDigit()
{
Item[] items = new Item[]{
new Item{
ItemCode = "DN999934"
}
};
ItemRepo itemRepo = new ItemRepo();
//I want to mock GetItems method here
}
}
我在测试代码中注释了我想要模拟的内容。我如何模仿这种方法?我如何对模拟依赖函数的方法进行单元测试?
您在评论中提到您正在从上下文类获取项目,这是您需要mock的类。
有很多文章解释了如何模拟DbContext,谷歌搜索的结果是如何模拟DbContext和DbSet与Moq进行单元测试?
[TestClass]
public class ItemRepoTests
{
[TestMethod]
public void GenerateItemCode_IncreaseDigit()
{
Item[] items = new Item[]{
new Item{
ItemCode = "DN999934"
}
};
var mockContext = new Mock<YourContext>();
// Code to inject items into mock context
// You may have to implement the context injection into your ItemRepo
// class if you do not already have it
ItemRepo itemRepo = new ItemRepo(mockContext.Object);
var result = itemRepo.GenerateItemCode();
// Code to check result is correct
}
}
因此,基本上,您在单元测试中创建了一个模拟DbContext,并传入一个假列表或诸如此类的项目数据。然后将这个模拟注入正在测试的类中,运行测试,如果代码一切正常,那么将在另一端输出正确的结果
用委托替换GetItems:
public class ItemRepo : IItemRepo
{
public Func<System.Collections.Generic.IEnumerable<Item>> Items = () =>
{ // all your orignal code
return items;
};
public string GenerateItemCode()
{
Item item = Items().OrderByDescending(x => x.Id).FirstOrDefault();
//do something
return itemCode;
}
}
测试代码中的替换您的委托:
public class ItemRepoTests
{
[TestMethod]
public void GenerateItemCode_IncreaseDigit()
{
Item[] items = new Item[]{
new Item{
ItemCode = "DN999934"
}
};
ItemRepo itemRepo = new ItemRepo();
itemRepo.Items = () => items;
//I want to mock GetItems method here
itemRepo.GenerateItemCode()
}
}
伪代码不测试,只描述思路