FakeItEasy 断言随机 <ignored> 参数失败(调用中有匹配项)

FakeItEasy failed assertion with randomly <ignored> param (and there is a match in the calls)

我正在尝试使用方法调用断言实施单元测试。 (一定是发生了)

我正在使用以下代码:

[Fact]
        public void Should_set_setting_and_map_new_value_for_non_existing_setting()
        {
            //Arrange
            var userSetting = new SettingDetailsBuilder().Build();
            var respository = A.Fake<ISettingsRepository>();
            A.CallTo(() => respository.GetUserSetting(0, 0, null)).WithAnyArguments().Returns(userSetting);
            var dataretriever = new SettingsDataRetriever(respository);

            //Act
            var newUserSetting = dataretriever.SetUserSetting("variableName", "SomeOtherValue", 1, 1, "FST");

            //Assert
            A.CallTo(() => respository.GetUserSetting(1, 1, "variableName")).MustHaveHappened();
        }

但我随机得到一个失败的测试,其中一些参数被提到为 "ignored"。但是,断言具有精确的参数。

错误:

Assertion failed for the following call:
    AlfaProNext.Repositories.Settings.ISettingsRepository.GetUserSetting(1, <Ignored>, <Ignored>)
  Expected to find it at least once but found it #0 times among the calls:
    1: AlfaProNext.Repositories.Settings.ISettingsRepository.Exists(varName: "variableName")
    2: AlfaProNext.Repositories.Settings.ISettingsRepository.GetUserSetting(
          userId: 1,
          profileId: 1,
          variableName: "variableName")

有人知道为什么会随机发生这种情况吗?

这可能是由于 XUnit 2.0 在使用早于 2.0.0-beta009 的 FakeItEasy 版本时并行执行测试。后者包括对 issue 476 的修复,它使用 ThatIgnored 线程安全进行参数约束。

如果可行,考虑升级到最新的FakeItEasy。 (您可以在 GitHub Project 查看最新的更改。)或者在 XUnit 中关闭并行测试执行。

在 FakeItEasy 论坛的一些很好的反馈之后,我得到了答案。显然,当前的稳定版本不是线程安全的,无法处理最新版本的 XUnit 2,后者 运行 并行测试。

https://github.com/FakeItEasy/FakeItEasy/issues/562

我的解决方法是将 FakeItEasy 升级到版本 2 beta 10。(替代方法是 运行 在单线程中进行测试)