Mog设置方法未调用

时间:2019-12-25 07:45:20

标签: c# asynchronous moq xunit

被调用,并且在集成测试中,我故意传递一个错误的值来测试错误处理。代码在引发异常之前记录错误,例如

    var tokenResponse = await Client.ExecuteAsync<TokenResponse>(TokenRequest);

    var typeString = typeof(GetAccountObjectRequest).Name;
    if (!ResourceDictionary.ContainsKey(typeString))
    {
        Logger.LogError($"{typeString} was not found in the resource dictionary");
        throw new InvalidProgramException($"{typeString} was not found in the resource dictionary");
    }

要捕获并记录此消息,我已将“ logger”设置为:

    mockLogger.Setup(foo => foo.LogError(It.IsAny<object>()))
              .Callback<object>((msg) =>
              {
                  System.Diagnostics.Debug.WriteLine(msg);
              });

最终像这样调用测试:

    Assert.ThrowsAsync<InvalidProgramException>(async () => await command.GetAccountObject("xxx"));

所以我期望的是将错误消息记录到调试控制台。相反,似乎从未调用过此方法。我开始仔细观察,发现我没有回来

var tokenResponse = await Client.ExecuteAsync<TokenResponse>(TokenRequest);

如上所示。测试通过,因为我正在做的唯一断言是引发了“ InvalidProgramExecution”异常。我在有问题的那一行周围放了一个try / catch块

var tokenResponse = await Client.ExecuteAsync<TokenResponse>(TokenRequest);

据我所知,没有异常是从该行返回,并且该行显然永远不会返回,但是当我在该行上添加断点并仅执行该行时,Visual Studio就会停止,就好像抛出了预期的异常一样。在模拟的界面中,我希望看到引发异常并将消息传递到各种Logger记录器的日志。想法?

1 个答案:

答案 0 :(得分:0)

我整理了一个在https://drive.google.com/open?id=1jAmzUjgrHqNCEl_Z6AMFrt8-NHHojeZ8工作的示例项目。处理异步测试时一定有一些操作员错误(我!)。