如何在ASP.NET MVC单元测试中使用Moq模拟测试类本身的功能

时间:2016-06-28 12:55:15

标签: asp.net asp.net-mvc unit-testing mocking moq

我正在开发一个ASP.NET MVC项目。在我的项目中,我正在进行单元测试。我使用Moq进行单元测试。但是我在测试一个依赖于它的另一个函数的模型类的方法时遇到了问题。请参阅下面的方案。

这是我要测试的模型类的示例

from sklearn.decomposition import PCA
pca = PCA(whiten=True)
whitened = pca.fit_transform(X)

我想测试GenerateItemCode方法

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;
    }
}

我在测试代码中评论了我想要模拟的东西。我该如何模仿该方法?我如何单元测试该方法模拟依赖函数?

2 个答案:

答案 0 :(得分:2)

您在评论中提到您正在从上下文类中获取项目,这是您需要进行模拟的类。

有很多文章解释了如何模拟DbContext,谷歌搜索的最佳结果How to mock DbContext and DbSet with Moq for unit testing?

[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并传入一个假的列表或项目数据。然后,您将此模拟注入您正在测试的类中,运行测试,如果所有代码都很好,那么正确的结果将在另一端吐出

答案 1 :(得分:0)

用委托替换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()
     }
  }

伪代码不是testet,只是为了描述这个想法