0

我看过一些帖子,例如this,但它没有回答我的问题。

基本上我已经使用 LINQKIT 来构建一个如下所示的表达式:

public Expression<Func<uv_Manifest, bool>> CreateManifestFilters(ManifestFilterItem filterItem)
{
    var predicate = PredicateBuilder.New<uv_Manifest>;

        if(!string.IsNullorWhiteSpace(filterItem.CID)){
        predicate = predicate.And(x => x.CID == filterItem.CID && x.CID != null);
        }

    return predicate;
}

我有一个看起来像这样的单元测试:

[TestMethod()]
public void CreateManifestFilters_FunctionHitWithCIDPopulated_ExpressionWillContainWhereOnCID()
{
    var filterItem = new ManifestFilterItem("002");
    var predicate = PredicateBuilder.New<uv_Manifest>.And(x => x.CID == filterItem.CID && x.CID != null);

    var result = _iManifestManager.CreateManifestFilters(filterItem);

    var manifest = new uv_Manifest();

    Assert.AreEqual(predicate, result);

}

我要做的是检查表达式是否在属性 CID 上执行位置。但是,当测试失败时出现此错误:

Assert.AreEqual 失败。预期:((CompareString(x.CID, value(FSVendor_Refactored.Tests.ManifestFixture+_Closure$__11-0).$VB$Local_filterItem.CID, False) == 0) AndAlso (Convert(x.CID) != null) )>。实际: ((CompareString(x.CID, value(FSVendor_RefactoredRepository.ManifestManager+_Closure$__2-0).$VB$Local_filterItem.CID, False) == 0) AndAlso (Convert(x.CID) != null))> .

我想我理解它为什么会失败,单元测试和 CreateManifestFilters 函数都在不同的项目中。所以我相信这会导致测试失败。

任何人都知道如何检查表达式以检查它是否在 CID 属性上的位置?

编辑:这不是重复的,因为其他答案不使用 PredicateBuilder 因此链接的答案不符合我的要求。

4

1 回答 1

1

我要做的是检查表达式是否在属性 CID 上执行位置。
...
任何人都知道如何检查表达式以检查它是否在 CID 属性上的位置?

是的,我能想到几种方法。最简单的可能是编译表达式并测试它。

[TestMethod()]
public void CreateManifestFilters_FunctionHitWithCIDPopulated_ExpressionFiltersOnCID()
{
    var filterItem = new ManifestFilterItem("002");
    var predicate = _iManifestManager.CreateManifestFilters(filterItem);
    var predicateFunc = predicate.Compile();
    var manifest1 = new uv_Manifest{ CID = "001" };
    var manifest2 = new uv_Manifest{ CID = "002" };

    var result1 = predicateFunc(manifest1);
    var result2 = predicateFunc(manifest2);

    Assert.IsFalse(result1);
    Assert.IsTrue(result2);
}

嘿,我不是要对表达式的结果进行单元测试。

为什么不?您明确表示您想检查表达式是否在 CID 属性上执行 WHERE。表达式的行为是否不如知道您击中if障碍重要?在这种情况下,让另一个注入服务提供 CID 检查表达式可能更合适,这样您就可以通过模拟该服务来对该方法进行单元测试。但这对我来说似乎有点矫枉过正。

另一种选择是,如果您只是想确保在该表达式上存在与 CID 相关的内容,则到ToString()该表达式并查找特定的子字符串,例如"filterItem.CID"在该字符串中。

这不是重复的,因为其他答案不使用 PredicateBuilder 因此链接的答案不符合我的要求。

实际上,如果您真的只是想在两个表达式树之间进行相等比较,正如您在代码示例中指出的那样,那么您如何生成表达式并不重要。如果它们是等价的,那么另一个 answer的表达式检查器应该可以正常工作。

于 2017-11-13T21:49:09.790 回答