如何在.net中存根通过引用传递枚举的方法?

时间:2013-11-07 13:58:38

标签: c# vb.net rhino-mocks

我不明白这是如何编译的。

我有一个VB.net类,其中包含以下内容:

Public Class Line
    Public Enum EligibleType
        skipNone = 0
        skipAllow = 1
        skipPay = 2
        skipDeleted = 4
        skipMod = 8
        skipOverride = 16
    End Enum

    Public Function Eligible(Optional ByRef enmEligibleFlag As Line.EligibleType = Line.EligibleType.brSkipNone) As Boolean
End Class

在应用程序中调用超过9,000次。我尝试在C#中为另一个函数编写测试方法,并使用Rhino Mocks创建类的存根。然后我将该函数存根为始终返回true。它不会编译。

[TestClass]
public class breMATest
{
    /// <summary>
    /// Tests the 102.
    /// </summary>
    [TestMethod]
    public void Test102()
    {
        // Arrange
        br target = new br();
        var line = MockRepository.GenerateStub<Line>();
        line.Stub(s => s.Eligible(ref Arg<Line.EligibleType>.Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy).Return(true);

        // Act
        target.Pay102(ref line);

        // Assert
    }
}

这给了我:

    CS1510: A ref or out argument must be an assignable variable
 UnitTestsCS\brTest.cs(35,13,35,71): error CS1502: The best overloaded method match for 'brBD.Line.Eligible(ref brBD.Line.EligibleType)' has some invalid arguments

我也尝试了这个,结果相同:

line.Stub(s => s.Eligible(brBD.Line.EligibleType.skipNone)).Return(true);

我试着直接调用它,同样的错误:

line.Eligible(ref brBD.Line.EligibleType.skipNone));

我理解错误。您无法通过引用传递枚举,因为枚举是常量而无法分配。所以我有两个问题:

  1. 有没有办法将其存根以便始终返回true?
  2. 为什么这在VB.NET中有效?
  3. 提前致谢,

    蒂姆

2 个答案:

答案 0 :(得分:1)

您作为ref传递的内容是:

Arg<Line.EligibleType>
  .Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy

现在;我们看不到Arg<T>.Ref,但我猜它会返回一个.Dummy属性的类。在C#中,无法将属性作为ref 传递。我想VB会选择欺骗这个,基本上相当于:

var tmp = Arg<Line.EligibleType>.Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy;
return s.Eligible(ref tmp)

但是,C#选择而不是以这种方式工作。 IIRC,VB也允许ref隐含,因此有一些非常不同的设计目标围绕如何处理ref

但是我必须同意C# - 在ref用法中,你并没有真正传递“对属性的引用”,所以对我来说至少是,它避免了错误用法以它的方式工作 - 即使这更明确。

顺便说一句:如果.Dummy字段,那么可以将其作为ref传递给您;但是,这不应被解释为“使.Dummy成为一个字段”;这非常我说的话; p

  

我理解错误。您无法通过引用传递枚举,因为枚举是常量而无法分配。

您可以将对字段的引用对局部变量/参数的引用以及对数组中的内容的引用传递为ref ;那些东西可以 输入为枚举。

答案 1 :(得分:0)

像这样写你的存根:

Line.EligibleType et = Line.EligibleType.SkipNone;
line.Stub(s => s.Eligible(ref et))
    .OutRef(Line.EligibleType.skipNone).Return(true);

参考必须是可分配的。你不能传递常数。

相关问题