c# - SameAs 断言调用 setter 与 VB.Net

标签 c# vb.net nunit

我在 nUnit 中发现了一些奇怪的行为吗?

以下 VB.Net 测试失败:

Test 'SameAsTest.UseSameAs' failed: 
  Expected string length 19 but was 29. Strings differ at index 19.
  Expected: "Prop1 Get,Prop1 Get"
  But was:  "Prop1 Get,Prop1 Get,Prop1 Set"

  ------------------------------^
    SameAsTest.vb(33,0): at SameAsTest.UseSameAs()

1 passed, 1 failed, 0 skipped, took 1.80 seconds (NUnit 2.5.5).

Option Strict On

Imports System
Imports System.Collections.Generic
Imports NUnit.Framework

<TestFixture()>
Public Class SameAsTest

    Private CallHistory As List(Of String)
    Private mPropValue As String = "ThisIsIt"


    Public Property Prop1 As String
        Get
            CallHistory.Add("Prop1 Get")
            Return mPropValue
        End Get
        Set(ByVal value As String)
            CallHistory.Add("Prop1 Set")
            mPropValue = value
        End Set
    End Property

    <SetUp()>
    Public Sub Setup()
        CallHistory = New List(Of String)
    End Sub

    <Test()>
    Public Sub UseSameAs()
        Assert.That(Prop1, [Is].SameAs(Prop1))
        Assert.That(String.Join(",", CallHistory.ToArray()), [Is].EqualTo("Prop1 Get,Prop1 Get"))
    End Sub

    <Test()>
    Public Sub UseAreSame()
        Assert.AreSame(Prop1, Prop1)
        Assert.That(String.Join(",", CallHistory.ToArray()), [Is].EqualTo("Prop1 Get,Prop1 Get"))
    End Sub
End Class

当 c# equiv 工作正常时:

2 passed, 0 failed, 0 skipped, took 0.19 seconds (NUnit 2.5.5).

using System;
using System.Collections.Generic;
using NUnit.Framework ;

    [TestFixture ]
    class Dummy
    {

        private List<String> CallHistory;
        private String mPropValue = "ThisIsIt";

        [SetUp]
        public void Setup()
        {
            CallHistory = new List<string>();
        }

        public String Prop1 
        {
            get
            {
            CallHistory.Add("Prop1 Get");
            return mPropValue;
            }
            set
            {
                CallHistory.Add("Prop1 Set");
                mPropValue = value;
            }
        }

        [Test]
        public void UseSameAs()
        {
            Assert.That(Prop1, Is.SameAs(Prop1));
            Assert.That(String.Join(",", CallHistory.ToArray()), Is.EqualTo("Prop1 Get,Prop1 Get"));

        }

        [Test]
        public void UseaAreSame()
        {
            Assert.AreSame(Prop1, Prop1);
            Assert.That(String.Join(",", CallHistory.ToArray()), Is.EqualTo("Prop1 Get,Prop1 Get"));

        }
}

最佳答案

问题实际上不是对 SameAs 的调用。问题是作为 Assert.That 调用的第一个参数传递的属性。

Assert.That 有许多不同的重载,事实证明重载解析在 VB 和 C# 中的完成方式不同。在 C# 中,属性匹配对象:

Asset.That(object actual, IResolveConstraint expression);

在 VB 中,它被匹配为:

Assert.That<Of T>(ByRef T actual, IResolveConstraint express);

由于 VB 版本实际上是将非引用属性值传递给需要引用的方法,因此它似乎通过创建本地字符串来模拟引用传递,通过引用将其传递到方法中,然后设置属性值到字符串的返回值。我不确定为什么它以这种方式选择函数,铁杆 VB 程序员也许能够解释它。

您可以通过声明一个局部变量并将其用作第一个参数来绕过它:

Dim prop1 = Prop1
Assert.That(prop1, [Is].SameAs(Prop1))

或者通过转换参数来强制它使用 That 方法的预期重载。

Assert.That(CType(Prop1, Object), [Is].SameAs(Prop1))

关于c# - SameAs 断言调用 setter 与 VB.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31272420/

相关文章:

c# - 异步函数中的 TaskCompletionSource

c# - 不重复的复杂排列

c# - 单元测试和检查私有(private)变量值

svn - 如果提交日志中包含明确的词,则在 cc.net 上运行构建

c# - 主构造函数未在 C# 6.0 中编译

c# - 我什么时候应该为 ApartmentState.STA 设置一个线程?

.net - C#/VB .Net 中的代码生成实用程序

vb.net - GlovePIE 和应用程序之间的通信

xml - VB.net读取编码错误的XML文件

msbuild - 以独立于平台的方式从 msbuild 项目运行 .net 可执行文件