我刚刚开始一个新项目,解决方案没有单一的单元测试。因此,我认为提高单元测试中低于平均水平的技能并学习应用程序的好方法是在我进行测试时编写测试。
我之前没有对xunit做太多,所以这可能是一个简单的问题,我自己也在寻找答案,但似乎无法找到答案。
我正在尝试测试的webapi项目。控制器有一个基本控制器,包含其记录方法,例如
public class BaseController : ApiController
{
private readonly ILog _log;
public BaseController(ILog log)
{
_log = log;
}
[ApiExplorerSettings(IgnoreApi = true)]
public virtual void Log(Enums.RequestType requestType, string detail)
{
_log.Info(string.Format("{0} | {1}",requestType, detail));
}
来自我的控制器
public virtual async Task<ActionResult<MyDetail>> Get([FromUri]long id)
{
Enums.RequestType requestType = Enums.RequestType.GET;
Log(requestType, "start called");
var card = await _repository.FindItemAsync(id);
Log(requestType, "thats a rap");
}
到目前为止我的测试看起来像是
[Fact()]
public void TestMyDetailsReturnsDetailAndLogs()
{
var detail = MockDetail();
_myController = new Mock<MyDetailController>(_repository.Object, _logging.Object);
_myController.Setup(m => m.Log(It.IsAny<Enums.RequestType>(),
It.IsAny<string>()));
_repository.Setup(x => x.FindItemAsync(It.IsAny<long>())
.ReturnsAsync(detail);
var controllerResult = _myController.Object.Get(detail.Id);
_myController.VerifyAll();
var negotiatedResult = controllerResult.Result;
Assert.NotNull(negotiatedResult);
其他信息:以下设置未匹配:
MyController m => m.Log(It.IsAny<RequestType>(), It.IsAny<String>())
2个问题,为什么我收到此消息?因为我已经设置了m.Log
我的控制器和存储库中的断点是否应该被击中?
任何帮助都会很棒!!
答案 0 :(得分:0)
我认为由于您的控制器被模拟,因此不会调用Get方法,因此内部实现调用不匹配。无论如何,如果您正在测试您的控制器,您不应该嘲笑它,只能嘲笑它。
答案 1 :(得分:0)
你嘲笑了你的&#34; _myController&#34;但它应该返回一些东西。 你准确地嘲笑它,因为你希望它能够返回你想要的东西。
所以添加return to end。在您的情况下填写返回类型日志。
_myController.Setup(m =&gt; m.Log(It.IsAny(), 。It.IsAny()))返回(XXX);
示例:假设Log返回bool并且您希望log返回true。 就是这样的 _myController.Setup(m =&gt; m.Log(It.IsAny(), 。It.IsAny()))返回(真);