Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对表达式进行单元测试?_C#_Unit Testing_Expression_Linqkit - Fatal编程技术网

C# 如何对表达式进行单元测试?

C# 如何对表达式进行单元测试?,c#,unit-testing,expression,linqkit,C#,Unit Testing,Expression,Linqkit,我看过一些像这样的帖子,但它没有回答我的问题 基本上,我使用LINQKIT构建了一个表达式,如下所示: public Expression<Func<uv_Manifest, bool>> CreateManifestFilters(ManifestFilterItem filterItem) { var predicate = PredicateBuilder.New<uv_Manifest>; if(!string.IsNullo

我看过一些像这样的帖子,但它没有回答我的问题

基本上,我使用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);

}
public Expression CreateManifestFilters(ManifestFilterItem filterItem)
{
var predicate=PredicateBuilder.New;
如果(!string.IsNullorWhiteSpace(filterItem.CID)){
谓词=谓词和(x=>x.CID==filterItem.CID&&x.CID!=null);
}
返回谓词;
}
我有一个单元测试,看起来像这样:

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

}
[TestMethod()]
public void CreateManifestFilters_函数HitWithCidPopulated_表达式将包含WhereOncId()
{
var filterItem=新的ManifestFilterItem(“002”);
var predicate=PredicateBuilder.New.And(x=>x.CID==filteriem.CID&&x.CID!=null);
var result=_iManifestManager.CreateManifestFilters(filterItem);
var manifest=新的uv_manifest();
aresequal(谓词、结果);
}
我要做的是检查表达式是否在属性CID上执行where操作。但是,当测试失败时,我会出现此错误:

Assert.AreEqual失败。预期:((CompareString(x.CID,value(FSVendor\u refactured.Tests.ManifestFixture+\u Closure$\uu 11-0)。$VB$Local\u filterietem.CID,False)==0)和(Convert(x.CID)!=null))>。实际:((比较限制(x.CID,值(FSVendor\u refacturedrepository.ManifestManager+\u Closure$\uu 2-0)。$VB$Local\u filterietem.CID,False)==0)和(转换(x.CID)!=null))>

我想我理解它失败的原因,单元测试和CreateManifestFilters函数都在不同的项目中。所以我认为这是导致测试失败的原因

有人知道如何检查表达式以检查它是否在CID属性上执行where操作吗

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

我要做的是检查表达式是否在属性CID上执行where操作。

有人知道如何检查表达式以检查它是否在CID属性上执行where操作吗

是的,我可以想出一些办法。最简单的可能是编译表达式并测试它

[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,因此链接的答案不符合我的要求


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

当单元测试只是执行与其测试的方法完全相同的代码时,它就违背了单元测试的目的。即使你修正了它以正确地比较结果,让一个单元测试与它所测试的方法完全相同也是没有价值的。嘿,我不是在尝试对表达式的结果进行单元测试。我的谓词生成器中确实有一些代码,用于检查CID是否为null或空,如果为空,它将跳过CID上的表达式。基本上,我试图测试,如果一个if返回true,那么将创建一个表达式,该表达式考虑了cid可能最简单的方法就是编译表达式并对编译后的函数进行单元测试。等等,你认为有一个解决方案,可以比较任意两个表达式,不管你是如何得到它们的,因为您碰巧使用了特定的工具来构造这些表达式,所以不能解决您的问题吗?如果表达式是相同的,那么如何创建表达式与如何进行比较无关。@Servy,你是对的。我道歉。我急于去吃午饭,没有修改代码以满足我的需求。尝试测试编译后的表达式无法很好地复制实际需求,因为有太多操作支持在无法正确转换为SQL的代码中编译和运行。还有一个相反的问题;如果编译并运行将无法工作的东西,但当传递给查询提供程序时,这些东西就可以正常工作。@Servy:是的,如果人们完全依赖这种测试方法来知道他们的代码是正确的,那么这是一个技术问题。希望他们能够进行一些集成测试,以确保查询能够真正运行。但是我认为它超出了这个问题的范围。如果你不打算实际使用测试来测试代码,那么为什么首先要使用测试呢?这没有任何帮助。如果您真的要花时间编写测试,那么应该确保测试确实测试代码是否工作,而不是编写充满误报和误报的测试。没有(自动)测试比有大量错误结果的测试要好。@Servy:选择要测试的代码段、要编写的测试数量以及应该是哪种类型等等,这些都是我们每天都需要根据我们对代码库、项目优先级、生命周期、团队规模的了解做出的决定,还有很多其他的因素,这些都不是一个简单的问题。如果OP认为测试此特定方法是否返回特定类型的表达式很重要,那么我可以提供alt