Анонимные типы в модульном тестировании

Я пишу приложение, которое позволяет пользователям «входить в систему», регистрируясь с тем же адресом электронной почты. (Не волнуйтесь, это не приложение, которое будет работать в Интернете, а также не хранит важные данные. Это временная регистрация и оно будет работать только в локальных сетях.) Предполагается, что метод MVC возвращает ключ API и некоторые другие данные после успешного входа в систему. Я создал модульный тест, чтобы проверить это поведение:

[Fact]
public void Register_ExistingEmail()
{
    //Arrange
    DbContext context = new DbContext(InMemoryDbContextOptionsExtensions.UseInMemoryDatabase(new DbContextOptionsBuilder<DbContext>(), "VoteInMemDb").Options);
    context.Users.Add(new User { ApiToken = "TestToken123", Email = "[email protected]", JsonData = "{}" });
    context.SaveChanges();
    //logger, hub and settings are being mocked using Moq and are set up in the constructor
    RegistrationController regCon = new RegistrationController(logger, context, hub, settings);

    //Act
    IActionResult result = regCon.Register("[email protected]", "{}", false);

    //Assert
    try
    {
        //attempt to cast to expected result type
        JsonResult jsonResult = (JsonResult)result;

        Assert.Equal(new
        {
            apiToken = "TestToken123",
            currentScreen = ClientScreen.welcome.ToString(),
            cookieDuration = settings.Value.ApiTokenDuration
        }, jsonResult.Value);
    }
    catch (EqualException e)
    {
        throw e;
    }
    catch
    {
        Assert.True(false);
    }
}

Теперь, несмотря на то, что он успешно возвращает объект, как и ожидалось, он все равно выдает EqualException:

Testname:   project.unit_tests.UnitTest1.Register_ExistingEmail
FullName für Test:  project.unit_tests.UnitTest1.Register_ExistingEmail
Testquelle: D:\Repositories\project.unit-tests\UnitTest1.cs : Zeile 77
Testergebnis:   Fehler
Testdauer:  0:00:01.009

Ergebnis StackTrace:    at project.unit_tests.UnitTest1.Register_ExistingEmail() in D:\Repositories\project.unit-tests\UnitTest1.cs:line 104
Ergebnis Meldung:   
Assert.Equal() Failure
Expected: { apiToken = TestToken123, currentScreen = welcome, cookieDuration = 1440 } (<>f__AnonymousType0`3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]])
Actual:   { apiToken = TestToken123, currentScreen = welcome, cookieDuration = 1440 } (<>f__AnonymousType1`3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]])

Я вижу, что это на 99% тот же объект, за исключением части <>f__AnonymousTypeX`3. Это потому, что я использую анонимный Types для создания JsonResults? Должен ли я создавать модели для каждого анонимного Type, который я возвращаю для модульного тестирования метода?

заранее спасибо


person lennyy    schedule 09.04.2019    source источник
comment
Assert.Equal проверяет ссылочное равенство, если типы являются ссылочными. Не имеет значения, имеют ли все свойства одинаковое значение. Если вы не хотите создавать класс, для которого вы можете переопределить Equals, вам придется определять равенство, сравнивая каждое свойство.   -  person Crowcoder    schedule 09.04.2019
comment
Возможный дубликат XUnit Assertion для проверки равенства объектов   -  person Kami    schedule 09.04.2019
comment
@Crowcoder Спасибо, я проверю!   -  person lennyy    schedule 09.04.2019