Linq:加入或忽略条件

时间:2013-11-18 11:05:46

标签: c# linq unit-testing

作为我开始为我的代码编写更多测试的努力的一部分,我使用了一个模拟的DataContext,其中包含用于单元测试的虚拟数据列表。

但是,我遇到了我正在测试的方法返回正确结果的尴尬情况,但是针对虚拟DataContext验证这些结果的测试代码却没有。

我正在测试的方法是: var earns = earnService.GetEarnsForCharacter(character.Id);

这将返回仅具有Id,Title和Display属性的非规范化Earn对象列表。实际的数据实体有更多属性,包括我正在测试的属性,即WorldId。我希望返回的Earn对象的WorldId等于character.WorldId

我认为我应该可以做这样的事情:

// Execute the method we're testing
var earns = earnService.GetEarnsForCharacter(character.Id);

// Assert that the character's world id is indeed equal to the world id's of all the selected earns
// First, fetch the earns from the datacontext
var worldIds = from ec in earns join e in mockedDataContext.Object.Get<Earn>() on ec.Id equals e.Id select e.WorldId;
foreach (var worldId in worldIds)
{
    Assert.AreEqual(character.WorldId, worldId);
}

但是,出于某种原因,虽然earns变量包含预期的2个对象,但无论我做什么,worldIds可枚举都包含3个对象。我也试过在where earns.Select(t => t.Id).Contains(e.Id)添加一个where子句,但这对结果也没有任何影响。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:0)

如果mockedDataContext.Object.Get<Earn>()返回两个具有相同Id值的项目,则您的联接将返回3条记录而不是预期的两条记录。