Moq 方法的Xunit设置未按预期工作

Moq 方法的Xunit设置未按预期工作,moq,xunit,xunit.net,Moq,Xunit,Xunit.net,我刚刚开始一个新项目,解决方案没有一个单独的单元测试。因此,我认为提高我在单元测试方面低于平均水平的技能并学习应用程序的一个好方法是边写边测试 我以前没有对xunit做过太多的工作,所以这可能是一个简单的问题,我自己也在寻找答案,但似乎找不到答案 这是一个我正在尝试测试的webapi项目。控制器有一个基本控制器,其中包含用于记录日志的方法,例如 public class BaseController : ApiController { private readonly ILog _log

我刚刚开始一个新项目,解决方案没有一个单独的单元测试。因此,我认为提高我在单元测试方面低于平均水平的技能并学习应用程序的一个好方法是边写边测试

我以前没有对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");
    }
公共虚拟异步任务Get([FromUri]长id)
{
Enums.RequestType RequestType=Enums.RequestType.GET;
日志(requestType,“启动调用”);
var card=await_repository.FindItemAsync(id);
日志(请求类型,“这是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);
[Fact()]
public void TestMyDetailsReturnsDetailAndLogs()
{
var detail=MockDetail();
_myController=new Mock(_repository.Object,_logging.Object);
_myController.Setup(m=>m.Log(It.IsAny()),
It.IsAny());
_repository.Setup(x=>x.FindItemAsync(It.IsAny())
.ReturnsAsync(详细信息);
var controllerResult=\u myController.Object.Get(detail.Id);
_myController.VerifyAll();
var negotiatedResult=controllerResult.Result;
Assert.NotNull(negotiatedResult);
其他信息:以下设置不匹配:

MyController m=>m.Log(It.IsAny(),It.IsAny())
2个问题,为什么我会收到这个消息?因为我已经设置了m.Log

我的控制器和存储库中的断点是否应该被命中


任何帮助都会很好!!

我认为,由于您的控制器被模拟,因此不会调用Get方法,因此内部实现调用不匹配。无论如何,如果您正在测试控制器,则不应该模拟它,只应该模拟它的依赖项。

我认为,由于您的控制器被模拟,因此不会调用Get方法,因此内部imp元素调用不匹配。无论如何,如果你在测试你的控制器,你不应该模拟它,只应该模拟它的依赖项。

你模拟了你的“\u myController”,但它应该返回一些东西。 准确地说,你嘲笑它是因为你想要它返回你想要的东西

所以,将return添加到末尾。在您的案例中,用类型log填充return的内部

_myController.Setup(m=>m.Log(It.IsAny()), It.IsAny()).Return(XXX)

示例:假设Log返回bool,您希望Log返回true。 应该是这样的 _myController.Setup(m=>m.Log(It.IsAny()), It.IsAny()).Return(true);

您嘲笑了您的“\u myController”,但它应该返回一些内容。 准确地说,你嘲笑它是因为你想要它返回你想要的东西

所以,将return添加到末尾。在您的案例中,用类型log填充return的内部

_myController.Setup(m=>m.Log(It.IsAny()), It.IsAny()).Return(XXX)

示例:假设Log返回bool,您希望Log返回true。 应该是这样的 _myController.Setup(m=>m.Log(It.IsAny()), It.IsAny()).Return(true)

 MyController m => m.Log(It.IsAny<RequestType>(), It.IsAny<String>())