Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 使用Microsoft Fakes进行单元测试-跳过函数_C#_Unit Testing_Ref_Microsoft Fakes_Shim - Fatal编程技术网

C# 使用Microsoft Fakes进行单元测试-跳过函数

C# 使用Microsoft Fakes进行单元测试-跳过函数,c#,unit-testing,ref,microsoft-fakes,shim,C#,Unit Testing,Ref,Microsoft Fakes,Shim,所以,我在这里为我的项目编写单元测试用例。我被困在一个有ref参数的函数调用的地方。示例:- 从支票金额(十进制dChkAmt,参考ICharge-oCharge,bool-blnAddTo,bool-blnIncludeRBL)到子域的公共十进制添加数 我正在编写一个调用上述函数(addToSubtractFromCheckAmount)的函数的测试用例,我想跳过它并提供我的自定义返回值 ** 使用(ShimsContext.Create()) ** 当我没有传递ref参数时,这是有效的,但是

所以,我在这里为我的项目编写单元测试用例。我被困在一个有ref参数的函数调用的地方。示例:-

从支票金额(十进制dChkAmt,参考ICharge-oCharge,bool-blnAddTo,bool-blnIncludeRBL)到子域的公共十进制添加数

我正在编写一个调用上述函数(addToSubtractFromCheckAmount)的函数的测试用例,我想跳过它并提供我的自定义返回值

** 使用(ShimsContext.Create())

** 当我没有传递ref参数时,这是有效的,但是当我给ICharge接口一个ref关键字时,该函数从我的单元测试用例类元数据中消失,当我构建项目时,我得到这个错误 **

错误101 Service.Fakes.ShimClassName.AllInstances'不包含 定义 'AddToSubtractFromCheckAmountDecimalChargeBooleanBoolean'

** 许多网站都在谈论具有字符串ref参数的填充函数,但不涉及接口、集合等。 比如说

当他的函数有一个ref参数时,他是如何在AllInstances中得到这个函数的


我被这件事困扰了一段时间。有人能帮忙吗?请告诉我,如果你们需要更多的信息,谢谢。

< P>如果你不挂起假货,你可以考虑使用NB取而代之。我一直在我的.NET项目中使用NSubstitute和Moq。它将是这样的:

//Create:
var chargeSubstitute= Substitute.For<ICharge>();

//Set a return value:
chargeSubstitute.DoSomething(whatever).Returns(resultYouWantToUseInTest);
decimal mockedFunction(ClassName instance, decimal dChkAmt, bool blnAddTo, bool blnIncludeRBL, ref ICharge oCharge)
{
    // ... assign oCharge?
    return 20m;
}

[TestMethod]
public void MyTest()
{
    using (ShimsContext.Create())
    {
        ShimClassName.AllInstances.addToSubtractFromCheckAmountDecimalBooleanBooleanIChargeRef
            = mockedFunction;

        // ...continue with test
    }
}

你可以根据你的期望值来测试。请参见或

从我的测试中,看起来只有将ref参数移到参数列表的末尾时,这才有效。我用两个int参数之间的interface ref参数做了一个测试,它没有出现在AllInstances属性中。但是,当我将ref参数移到末尾时,它出现了

如果这样做,您应该会看到一个名为“
addToSubtractFromCheckAmountDecimalBooleanBooleanIChargeRef
”的垫片委托

要记住的另一件事是,不能对lambda使用ref参数,因此需要创建一个函数并将其分配给委托。大概是这样的:

//Create:
var chargeSubstitute= Substitute.For<ICharge>();

//Set a return value:
chargeSubstitute.DoSomething(whatever).Returns(resultYouWantToUseInTest);
decimal mockedFunction(ClassName instance, decimal dChkAmt, bool blnAddTo, bool blnIncludeRBL, ref ICharge oCharge)
{
    // ... assign oCharge?
    return 20m;
}

[TestMethod]
public void MyTest()
{
    using (ShimsContext.Create())
    {
        ShimClassName.AllInstances.addToSubtractFromCheckAmountDecimalBooleanBooleanIChargeRef
            = mockedFunction;

        // ...continue with test
    }
}

方法名称为cammel大小写。这是坏习惯。建议遵循c#代码约定。这很好,我在我的主要项目中遵循正确的编码实践。这只是测试项目中的一个测试用例。作为“我的公司”项目,除了Microsoft Fakes,我们没有使用其他任何东西的权限。那真是个倒霉蛋。谢谢斯派克,你的答案看起来很好,但我认为我无法使用它。