【问题标题】:Why does this MustHaveHappened call on a FakeItEasy object fail in MSpec?为什么这个 MustHaveHappened 调用 FakeItEasy 对象在 MSpec 中失败?
【发布时间】:2013-03-25 14:59:43
【问题描述】:

运行以下测试时,所有断言都失败。无法弄清楚它们为什么会失败,因为实际的实现确实有对对象的调用。

这是一个已知的错误吗?因为其他一些测试确实成功了。

[Subject("Pst Cleanup")]
public class When_running_Pst_CleanUp
{
    Establish context = () =>
    {
        _folders = A.Fake<IOutlookFolderParameters>();
        _processor = A.Fake<IOutlookPstCleaner>();
    };

    Because of = () => _processor.Cleanup(_folders);

    It should_cleanup_the_mail_folder = () => A.CallTo(() => _folders.EmailFolder).MustHaveHappened();
    It should_cleanup_tasks_folder = () => A.CallTo(() => _folders.TaskFolder).MustHaveHappened();
    It should_cleanup_appointments_folder = () => A.CallTo(() => _folders.AppointmentFolder).MustHaveHappened();

    private static IOutlookPstCleaner _processor;
    private static IOutlookFolderParameters _folders;
}

以下调用的断言失败:Outlook.Contracts.IOutlookFolderParameters.get_NotificationsFolder() 预计至少会找到一次,但没有调用假对象。

在 FakeItEasy.Core.FakeAsserter.AssertWasCalled(Func2 callPredicate, String callDescription, Func2repeatPredicate,StringrepeatDescription) 在 FakeItEasy.Configuration.RuleBuilder.MustHaveHappened(Repeated:repeatConstraint) 在 UnitTests.When_running_Pst_CleanUp.<.ctor>b__2() 在 When_Clunning_Pst_ :第 19 行

【问题讨论】:

  • 刚刚添加了测试结果。
  • 我实际上没有看到与错误匹配的断言。我没有看到调用get_NotificationsFolder() 的期望(看起来像是为自动属性或其他东西生成的方法)。你为什么要测试 getter 被调用?这不能正确地固定你的行为。 _processor 对那些您可以断言的文件夹做了什么
  • 哎呀,你的_processor 也是假的。那是行不通的。它必须是一个真实的实例。
  • _processor 在 pst 中进行实际清理。我测试是否调用了属性,因为这样我可以确定清理中的所有步骤都已经发生......
  • 但是你的 _processor 是假的。你实际上并没有在这里测试任何你自己的代码

标签: c# unit-testing mspec fakeiteasy


【解决方案1】:

这是 FakeItEasy 绝对正确的行为。您需要使用IOutlookPstCleaner 的实际实现来使您的测试成功。始终确保您伪造正确的东西,不要意外伪造您的 SUT。

通过测试刚刚调用的属性,您绝对不会测试任何有价值的东西。我也可以为IOutlookPstCleaner编写这个实现,你的测试就会成功:

public class Cleaner : IOutlookPstCleaner 
{
    public void Cleanup(IOutlookFolderParameters folders)
    {
        var email = folders.EmailFolder;
        var task = folders.TaskFolder;
        var appointment = folders.AppointmentFolder;
    }
}

如果您发布 IOutlookPstCleaner 的实现,我很乐意帮助您找到正确的测试对象。

【讨论】:

  • +1 在最简单的情况下,将_processor = A.Fake&lt;IOutlookPstCleaner&gt;(); 替换为_processor = new OutlookPstCleaner(); 然后实际测试应该发生的事情
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 2012-03-14
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多