Структура теряет ценность в UnitTestC#

Место общения программистов C#
Anonymous
Структура теряет ценность в UnitTest

Сообщение Anonymous »

Я столкнулся со странным поведением и хотел бы уточнить, что здесь происходит.
Я создал простую неизменяемую структуру

Код: Выделить всё

public readonly struct MatchingPair : IEquatable
{
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);
}
}
— это простое перечисление, ничего особенного.
После этого я создал класс Exception, который будет вызываться, когда активы недействительны.
Как бы я ни был ленив, я не писал каждый тестовый пример, вместо этого я использовал DynamicDataAttribute из среды модульного тестирования MSTestv2.
Однако это не работает должным образом, поскольку 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 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];
}
}
}
}
Однако в Unittests для обоих свойств актива установлено значение Assets.Btc, что может означать только то, что для них установлено значение по умолчанию (0). Но я ожидал, что они будут придерживаться фактических ценностей, которые я установил. Значения установлены правильно, ожидаемое сообщение, которое я собрал, является доказательством этого, поскольку оно показывает правильные значения.
Может ли кто-нибудь пролить свет на то, что здесь происходит.
Я думаю, Возможное решение — преобразовать структуру в класс, но я хочу этого избежать.

Подробнее здесь: https://stackoverflow.com/questions/787 ... n-unittest

Вернуться в «C#»