我對使用Moq和Nunit進行單元測試還很陌生,而且我遇到了一種情況。我想要的是我的模擬器有一個輸出參數,我的系統正在測試,然後用它來決定採取什麼動作。Moq out參數
我的被測系統是一個MVC API控制器,特別是我試圖測試POST方法。我想在驗證失敗時返回對象的錯誤消息。
這裏是控制器的方法代碼:
public IHttpActionResult Post(Candidate candidate)
{
try
{
if(candidate==null)
return BadRequest();
IEnumerable<string> errors;
_candidateManager.InsertCandidate(candidate, out errors);
if (errors!=null && errors.Any())
return BadRequest(CreateErrorMessage("Invalid candidate: ", errors));
return CreatedAtRoute("DefaultApi", new {id = candidate.CandidateId}, candidate);
}
catch (Exception)
{
return InternalServerError();
}
}
這是我的單元測試代碼:
[Test]
[Category("CandidateManagerController Unit Tests")]
public void Should_Return_Bad_Request_When_Creating_Invalid_Candidate()
{
IEnumerable<string> errors = new List<string>() {"error1", "error2"};
var mockManager = new Mock<ICandidateManager>();
mockManager.Setup(x => x.InsertCandidate(new Candidate(), out errors)).Callback(()=>GetErrors(errors));
var sut = new CandidateManagerController(mockManager.Object);
var actionResult = sut.Post(new Candidate());
Assert.IsInstanceOf<BadRequestResult>(actionResult);
}
我想到的是,當_candidateManager.InsertCandidate()運行,則錯誤變量被填充。但是,發生什麼情況是,當您逐步執行控制器代碼時,_candidateManager.InsertCandidate()方法運行後,錯誤爲空。
如果任何人有任何想法我做錯了什麼,或者如果我想要做的是不可能使用Moq那麼請讓我知道。
感謝
您必須設置錯誤。什麼是GetErrors的實現? –