使用 VB.Net 调用 setter 的 SameAs 断言
SameAs Assertion calling setter with VB.Net
我在 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))
我在 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))