FluentAssertions терпит неудачу со структурой с перечислением, но не классом - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть вложенные class и FluentAssertions могут их утверждать.
Затем я изменяю class на struct, и проверка не проходит.

(Если я изменю IEnumerable<ItemStruct> MyItems { get; set; } на ItemStruct MyItem { get; set; }, сравнение будет успешным в обоих случаях. Поэтому я думаю это связано с IEnumerable.)

using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;

namespace CowsCannotReadLogs.FileHandling.UnitTest
{
    [TestClass]
    public class TestFluentAssertionStruct
    {
        public struct DataStruct
        {
            public IEnumerable<string> MyItems { get; set; }
        }

        // Fails.
        [TestMethod]
        public void TestSimpleStruct()
        {
            var data1 = new DataStruct { MyItems = new[] { "A" } };
            var data2 = new DataStruct { MyItems = new[] { "A" } };
            data1.Should().BeEquivalentTo(data2);
        }

        // Fails.
        [TestMethod]
        public void TestSimpleStructWithComparingByValue()
        {
            var data1 = new DataStruct { MyItems = new[] { "A" } };
            var data2 = new DataStruct { MyItems = new[] { "A" } };
            data1.Should().BeEquivalentTo(data2, 
                options => options.ComparingByValue<DataStruct>());
        }


        public class DataClass
        {
            public IEnumerable<string> MyItems { get; set; }
        }

        // Succeeds.
        [TestMethod]
        public void TestSimpleClass()
        {
            var data1 = new DataClass { MyItems = new[] { "A" } };
            var data2 = new DataClass { MyItems = new[] { "A" } };
            data1.Should().BeEquivalentTo(data2);
        }
    }
}

1 Ответ

1 голос
/ 06 апреля 2019

При использовании BeEquivalentTo на struct с два экземпляра по умолчанию сравниваются по семантике значения . для сравнения структур по их элементам поведение по умолчанию может быть переопределено локально или глобально.

Локально внутри теста:

[TestMethod]
public void Test()
{
    subject.Should().BeEquivalentTo(expected, 
        opt => opt.ComparingByMembers<DataStruct>());
}

Глобально, например, [AssemblyInitialize]:

[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
    AssertionOptions.AssertEquivalencyUsing(opt => opt.ComparingByMembers<DataStruct>());
}

...