我正在尝试使用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")
有人知道为什么会随机发生这种情况吗?
答案 0 :(得分:1)
这可能是由于测试是在使用早于2.0.0-beta009的FakeItEasy版本时由XUnit 2.0并行执行的。后者包括issue 476的修正,它使用That
和Ignored
线程安全来限制参数。
如果可行,请考虑升级到最新的FakeItEasy。 (您可以在GitHub Project查看最新更改。)或者在XUnit中关闭并行测试执行。
答案 1 :(得分:1)
在FakeItEasy论坛得到一些很好的反馈后,我得到了答案。显然,当前的稳定版本不是线程安全的,无法处理最新版本的XUnit 2,它正在并行运行测试。
https://github.com/FakeItEasy/FakeItEasy/issues/562
我的修复是将FakeItEasy升级到版本2 beta 10.(替代方法是在单个线程中运行测试)