簡體   English   中英

如何為實體框架模擬接口?

[英]How to mock an interface for entity framework?

我按照此處的答案在實體框架中為DbContext創建接口。 問題是,我不知道如何使用它進行單元測試。 我要測試的控制器有兩個構造函數。 一個沒有參數,並將IDbContext實例變量設置為新的DbContext。 另一個采用IDbContext並設置相同的實例變量。 我正在測試的方法就是這樣做

return context.EntitySet<question>().ToList();

以下是我使用Moq並測試控制器的失敗嘗試。 我沒有更改答案中列出的接口或部分類中的任何內容。 也許我需要添加一些內容?

            Mock<IDbContext> mockContext = new Mock<IDbContext>();
        question TestQuestion = new question { 
            Id = 1,
            ToAsk = "Did this test work?"
        };
        mockContext.Object.EntitySet<question>().Add(TestQuestion);

        QuestionsController controller = new QuestionsController( mockContext.Object );
        List<DHT.Entity.Models.question> questions = controller.Get();
        Assert.AreEqual(questions.Count, 1);

我對.NET和C#還是很陌生,所以如果我做的所有事情都完全錯誤,請告訴我。 我提供的鏈接中的方法似乎比實現整個存儲庫模式更簡單。 我只是試圖能夠找到對單元代碼進行單元測試的最簡單方法。

您可以使用FakeDbSet NuGet包或實現自己的InMemoryDbSet<T>類(代碼段中使用的InMemoryDbSet<T>是FakeDbSet包中的一個):

Mock<IDbContext> mockContext = new Mock<IDbContext>();
question TestQuestion = new question { 
    Id = 1,
    ToAsk = "Did this test work?"
};
IDbSet<question> questions = new InMemoryDbSet<question>(true){ TestQuestion };
mockContext.Setup(c => c.EntitySet<question>()).Returns(questions);

QuestionsController controller = new QuestionsController( mockContext.Object );
List<DHT.Entity.Models.question> questions = controller.Get();
Assert.AreEqual(questions.Count, 1);

暫無
暫無

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

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