我遇到了一种奇怪的行为,想澄清一下这里发生了什么。 我确实创建了一个简单的不可变结构
public readonly struct MatchingPair : IEquatable<MatchingPair>
{
private MatchingPair(Assets asset1, Assets asset2, bool validate = true)
{
if (validate)
{
InvalidMatchingPairException.ThrowIfEqualOrUnknown(asset1, asset2);
}
if (asset1 < asset2)
{
Asset1 = asset1;
Asset2 = asset2;
}
else
{
Asset1 = asset2;
Asset2 = asset1;
}
}
public static MatchingPair Create(Assets asset1, Assets asset2)
{
return new MatchingPair(asset1, asset2);
}
internal static MatchingPair InternalCreate(Assets asset1, Assets asset2)
{
return new MatchingPair(asset1, asset2, false);
}
public Assets Asset1 { get; }
public Assets Asset2 { get; }
public override string ToString()
{
return $"{Asset1}<->{Asset2}";
}
public bool Equals(MatchingPair other)
{
return Asset1 == other.Asset1 && Asset2 == other.Asset2;
}
public override bool Equals(object? obj)
{
return obj is MatchingPair other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine((int)Asset1, (int)Asset2);
}
public static bool operator ==(MatchingPair left, MatchingPair right)
{
return left.Equals(right);
}
public static bool operator !=(MatchingPair left, MatchingPair right)
{
return !left.Equals(right);
}
}
Assets
是一个简单的枚举,没什么花哨的。
之后,我创建了一个异常类,当资产无效时将引发该异常类。
虽然我很懒,但我没有编写每个测试用例,而是使用了 MSTestv2 单元测试框架中的 DynamicDataAttribute
。
然而,这并没有按预期工作,因为 MatchingPair 正在丢失它的值。
最小的测试看起来像
[TestMethod]
[DynamicData(nameof(MatchingEngineExceptionConstructor4Data))]
public void MatchingEngineException_Constructor4_Test(string? message, MatchingPair? matchingPair, string expectedMessage)
{
if (matchingPair.HasValue)
{
Assert.AreEqual(Assets.Btc, matchingPair.Value.Asset1);
Assert.AreEqual(Assets.Etc, matchingPair.Value.Asset2); // Fails unexpectedly
}
// ...actual test...
}
为了创建测试数据,我执行了以下操作
private static IEnumerable<object?[]> MatchingEngineExceptionConstructor4Data
{
get
{
foreach (var message in new[] { null, "Céẞßö." })
{
var expectedMessage = message ?? "Error in the matching engine.";
foreach (MatchingPair? matchingPair in new MatchingPair?[] { null, MatchingPair.Create(Assets.Btc, Assets.Etc) })
{
if (matchingPair != null) { expectedMessage += $" (MatchingPair '{matchingPair}')"; }
yield return [message, matchingPair, expectedMessage];
}
}
}
}
但是,在单元测试中,两个资产属性都设置为
Assets.Btc
,这只能意味着它们设置为默认值 (0)。但我本以为它们会保留我设定的实际值。这些值设置正确,我放在一起的预期消息就是证明,因为它显示了正确的值。
有人可以解释一下这里发生的事情吗? 我想一个可能的解决方法是将结构转换为类,但我想避免这种情况。
我已经确认这似乎是 MSTest 中的一个错误。 我已将测试更改为在 xUnit 上运行,并且它不会失败。
我在 MSTest 存储库上发布了 一个 github 问题