[英]How to fill a Mock<DbSet> in Nunit with Moq?
我正在嘗試用測試實體填充模擬數據庫集,但我只會在異常后出現異常。 我對 Nunit 測試很陌生,還沒有真正掌握它。 我正在嘗試在我的存儲庫中測試一個簡單的刪除方法,這里是該方法的代碼:
public async Task DeleteQuestion(Question questionToRemove)
{
if (questionToRemove is not null)
{
var questionsAnswers = await _context.Answers.Where(a => a.Question == questionToRemove).ToListAsync();
foreach (Answer a in questionsAnswers)
{
_context.Answers.Remove(a);
await _context.SaveChangesAsync();
}
_context.Questions.Remove(questionToRemove);
await _context.SaveChangesAsync();
var questions = await _context.Questions.Where(q => q.Quiz == questionToRemove.Quiz).ToListAsync();
int order = 1;
foreach (Question question in questions)
{
question.QuestionOrderId = order;
await _context.SaveChangesAsync();
order++;
}
}
}
這是我寫的測試:
public async Task DeleteQuestionFunction()
{
//Arrange
Question testQuestion = new Question { QuestionId = 1, QuestionText = "Test" };
Answer testAnswer = new Answer { Question = testQuestion, AnswerId = 1, AnswerText = "TestAnswer" };
_appDBContextMock.SetupAdd(x => x.Questions.Add(testQuestion));
_appDBContextMock.SetupAdd(x => x.Answers.Add(testAnswer));
//Act
var questionListcomponent = new QuestionListComponent();
questionListcomponent.DeleteQuestion(testQuestion);
var testresult = await _questionRepositoryMock.Object.GetQuestionById(testQuestion.QuestionId);
//Assert
Assert.That(testresult, Is.Null);
}
當我只使用 Setup 方法時,我得到了這個異常:
System.NotSupportedException: Unsupported expression: x => x.Questions 不可覆蓋的成員(此處:AppDbContext.get_Questions)不得用於設置/驗證表達式。
現在使用 SetupAdd function 我得到這個異常:
System.ArgumentException:無法實例化 class 的代理:TietoQuiz.Models.DbContexts.AppDbContext。 找不到無參數的構造函數。 (參數'constructorArguments')
我認為我的問題是我不知道如何正確設置模擬數據庫集。 我嘗試谷歌,但我發現了很多不同的方式和很多評論說“不推薦/錯誤的方式”,這對新手來說非常混亂,所以我希望這里的人能幫忙!
如果要使用上下文編寫測試,則必須創建自己的上下文並在運行后驗證數據。 您不能將模擬與不可覆蓋的方法一起使用。
您必須使用臨時文件來創建此上下文,而不是更改您的生產數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.