结构在单元测试中失去价值

问题描述 投票:0回答:1

我遇到了一种奇怪的行为,想澄清一下这里发生了什么。 我确实创建了一个简单的不可变结构

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)。但我本以为它们会保留我设定的实际值。这些值设置正确,我放在一起的预期消息就是证明,因为它显示了正确的值。

有人可以解释一下这里发生的事情吗? 我想一个可能的解决方法是将结构转换为类,但我想避免这种情况。

c# unit-testing struct mstest
1个回答
0
投票

我已经确认这似乎是 MSTest 中的一个错误。 我已将测试更改为在 xUnit 上运行,并且它不会失败。

我在 MSTest 存储库上发布了 一个 github 问题

© www.soinside.com 2019 - 2024. All rights reserved.