【发布时间】:2019-11-04 21:39:16
【问题描述】:
我正在尝试测试一种将字典作为参数的方法,通过删除一些不必要的条目来过滤它并返回结果字典。我已经单独编写了过滤类正常工作的测试,所以这个测试只关心过滤器被调用并返回字典。
由于某种原因,过滤器返回空字典,即使我用 FakeItEasy 明确告诉它要返回什么。
_callToChartOfAccountsFilterer 断言失败并显示以下消息:
ChartOfAccountsParser
public class ChartOfAccountsParser : IChartOfAccountsParser
{
private readonly IJsonDeserializer _jsonDeserializer;
private readonly IChartOfAccountsFilterer _chartOfAccountsFilterer;
public ChartOfAccountsParser(IJsonDeserializer jsonDeserializer, IChartOfAccountsFilterer chartOfAccountsFilterer)
{
_jsonDeserializer = jsonDeserializer;
_chartOfAccountsFilterer = chartOfAccountsFilterer;
}
public Dictionary<string, List<AccountForParserDto>> GetChartOfAccountsDictionaryBasedOnJsonFile(
ChartOfAccountsParsingParameters parsingParameters)
{
var filePath = GetPathOfJsonFile(parsingParameters.FileName);
var dictionary = ParseJsonToDictionary(filePath);
var dic = _chartOfAccountsFilterer.FilterAccounts(dictionary, (ChartOfAccountsFilteringParameters)parsingParameters);
return dic;
}
private string GetPathOfJsonFile(string fileName) => Path.Combine(GetFolderOfExecutingAssembly(), "ChartOfAccounts\\Json", fileName);
private string GetFolderOfExecutingAssembly()
=> new Uri(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException()).LocalPath;
private Dictionary<string, List<AccountForParserDto>> ParseJsonToDictionary(string filePath)
=> _jsonDeserializer.Load<Dictionary<string, List<AccountForParserDto>>>(filePath);
}
ChartOfAccountsParserTests
[TestFixture]
public class ChartOfAccountsParserTests
{
private IJsonDeserializer _jsonDeserializer;
private IChartOfAccountsFilterer _chartOfAccountsFilterer;
private AccountForParserDto _dto;
private ChartOfAccountsParsingParameters _parameters;
private string _key;
private List<AccountForParserDto> _group;
private Dictionary<string, List<AccountForParserDto>> _dictionary;
private IReturnValueArgumentValidationConfiguration<Dictionary<string, List<AccountForParserDto>>> _callToJsonDeserializer;
private IReturnValueArgumentValidationConfiguration<Dictionary<string, List<AccountForParserDto>>> _callToChartOfAccountsFilterer;
[SetUp]
public void Setup()
{
_jsonDeserializer = A.Fake<IJsonDeserializer>();
_chartOfAccountsFilterer = A.Fake<IChartOfAccountsFilterer>();
_dto = new AccountForParserDto { Name = "Account1" };
_parameters = new ChartOfAccountsParsingParameters { FileName = "a.json" };
_key = "Group1";
_group = new List<AccountForParserDto> { _dto };
_dictionary = new Dictionary<string, List<AccountForParserDto>> { [_key] = _group} ;
_callToJsonDeserializer = A.CallTo(() => _jsonDeserializer.Load<Dictionary<string, List<AccountForParserDto>>>(A<string>._));
_callToChartOfAccountsFilterer = A.CallTo(() => _chartOfAccountsFilterer.FilterAccounts(
A<Dictionary<string, List<AccountForParserDto>>>._,
A<ChartOfAccountsParsingParameters>._));
_callToJsonDeserializer.Returns(_dictionary);
_callToChartOfAccountsFilterer.Returns(_dictionary);
}
[Test]
public void GetChartOfAccountsDictionaryBasedOnJsonFile_GivenDictionaryIgnoringParameters_ReturnsSameDictionary()
{
var parser = new ChartOfAccountsParser(_jsonDeserializer, _chartOfAccountsFilterer);
var result = parser.GetChartOfAccountsDictionaryBasedOnJsonFile(_parameters);
Assert.That(result.ContainsKey(_key));
Assert.That(result.ContainsValue(_group));
_callToJsonDeserializer.MustHaveHappenedOnceExactly();
_callToChartOfAccountsFilterer.MustHaveHappenedOnceExactly();
}
}
【问题讨论】:
-
您的代码无法编译。即使抛开一些缺失的类,
ChartOfAccountsParser.GetChartOfAccountsDictionaryBasedOnJsonFile在声明之前就使用了变量dictionary。我不知道实际的方法是做什么的,所以很难说你出了什么问题。 -
但是,当我用
var dictionary = _chartOfAccountsFilterer.FilterAccounts(new Dictionary<string, List<AccountForParserDto>>());替换调用时,测试通过了。 -
@BlairConrad 为了清楚起见,我删除了一些代码,但我走得太远了。我将恢复编辑
标签: c# unit-testing nunit fakeiteasy