簡體   English   中英

Moq和通用存儲庫的單元測試

[英]Unit testing with Moq and a Generic Repository

我正在用Moq創建我的第一個測試單元,但似乎無法使其正常工作。

我有一個通用存儲庫,可以注入我的ApplicationDbContext。 我正在嘗試接收數據庫中存儲的所有食物的列表。 在我的實際服務中,我使用了簡單注入器,並且在那里一切正常。

ApplicationDbContext:

public class ApplicationDbContext : IdentityDbContext<AppUser>
{
    public ApplicationDbContext()
        : base("ApplicationDbContext")
    {
    }
    ...
}

通用存儲庫:

public class Repository<T> : IRepository<T> where T : class
{
    private ApplicationDbContext _context;
    private readonly IDbSet<T> _entities;

    public Repository(ApplicationDbContext context)
    {
        _context = context;
        _entities = _context.Set<T>();
    }

    .. async methods .. (GetAllAsync)
}

最小起訂量:

[TestClass]
public class FoodServicesTest
{
    private Mock<IRepository<Food>> _foodRepository;

    [TestInitialize]
    public void Initialize()
    {
        _foodRepository = new Mock<IRepository<Food>>();
    }

    [TestMethod]
    public async Task CanGetAllFoods()
    {
        // Before edit 2
        //IList<Food> foods = await _foodRepository.Object.GetAllAsync();
        //_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foods);

        _foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(List<Food>());
        IList<Food> foods = await _foodRepository.Object.GetAllAsync();

        Assert.IsTrue(foods.Count >= 1);
    }
}

編輯2:

將安裝程序放置在GetAllAsync()上方(感謝Patrick Quirk)並將其參數替換為“ new List()”之后,食物列表不再返回null,而是返回0,這可能更好,但我希望它是2 (例如服務中)。

返回值是一個空列表。 這是由您的代碼這一行指定的

_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(new List<Food>());

上面的指令實際上是在調用GetAllAsync時告訴模擬對象返回一個新的空列表。

您應該改為創建新的Food對象,以“模擬”數據庫中的結果,如下所示:

var foodList = new List<Food>();
foodList.Add(new Food() { ...insert your mocked values here });
foodList.Add(new Food() { ...insert your mocked values here });
_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foodList);

編輯

在代碼上看起來更好,我只能看到您只是在使用模擬對象,並查看是否返回結果。 您確定此測試確實需要嗎? 當涉及要測試的某些業務邏輯時,在存儲庫上使用模擬對象很有用。 也許您的代碼只是為了提出問題而被重寫,但值得指出。

您可以指定值以這種方式返回:

var foods=new List<Food>();
//// add two items here
foods.Add(new food(){.. set values });
foods.Add(new food(){.. set values });

_foodRepository.Setup(m => m.GetAllAsync()).ReturnsAsync(foods);
IList<Food> foods = await _foodRepository.Object.GetAllAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM