【问题标题】:FakeItEasy - capture exception to assert messageFakeItEasy - 捕获异常以断言消息
【发布时间】:2021-08-20 17:30:12
【问题描述】:

我有以下测试:

    [Test]
    public void Save_WhenExceptionIsThrown_ThenExceptionIsLogged()
    {
        A.CallTo(() => this.personRepository.Save(A<PrsPerson>._)).Throws(new Exception("Expected Exception"));

        var personen = this.GetPersonenCollectionWithSpecificAmount(2);

        this.testee.Save(personen);

        A.CallTo(() => this.applicationLogger.Error(A<string>._)).MustHaveHappened(Repeated.Exactly.Once);
    }

这就像一个魅力,但我想另外断言的是,是否使用引发异常的消息而不是任何字符串来调用记录器。

是否可以捕获抛出的异常,如果可以,如何捕获?

【问题讨论】:

    标签: c# .net unit-testing fakeiteasy


    【解决方案1】:

    在方法调用 lambda 中明确指定所需的参数值。

    尝试关注

     A.CallTo(() => this.applicationLogger.Error("Expected Exception"))
     .MustHaveHappened(Repeated.Exactly.Once);
    

    【讨论】:

    • 嘿,谢谢你的回答。我不想对字符串进行硬编码。我希望能够将断言设置为:A.CallTo(() =&gt; this.applicationLogger.Error(ex.Message)).MustHaveHappened(Repeated.Exactly.Once); 其中 exc 是抛出的异常
    • 那么我认为你最好的方法是var ex = new Exception("Expected Exception"); A.CallTo(() =&gt; this.personRepository.Save(A&lt;PrsPerson&gt;._)).Throws(ex); /* … */ A.CallTo(() =&gt; this.applicationLogger.Error(ex.Message)).MustHaveHappened(Repeated.Exactly.Once); 捕获字符串是可能的,但更多的工作,我认为这也可以工作并且阅读更好。
    【解决方案2】:

    记录器被注入了吗?你可以嘲笑它。

    class ListLogger : List<string>, ILogger
    {
        public void LogException(Exception ex)
        {
            Add(ex.ToString());
        }
    }
    

    然后在测试“行动”之后,您可以查看预期的异常是否在列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多