【发布时间】:2016-06-28 15:21:57
【问题描述】:
我对使用 Moq 和 Nunit 进行单元测试还很陌生,我遇到了一个场景问题。我想要的是让我的模拟有一个输出参数,然后我的被测系统将使用这些参数来决定采取什么行动。
我的测试系统是一个 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的实现是什么?
标签: unit-testing nunit moq