FakeItEasy使用随机<ignored> param失败断言(并且调用中存在匹配)

时间:2015-11-30 09:57:00

标签: unit-testing fakeiteasy

我正在尝试使用methodcall断言实现单元测试。 (MustHaveHappened)

我正在使用以下代码:

[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();
        }

但是我随机得到一个失败的测试,其中一些参数被称为“被忽略”。但是,断言具有确切的参数。

错误:

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")

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

我的修复是将FakeItEasy升级到版本2 beta 10.(替代方法是在单个线程中运行测试)