Я пишу приложение, которое позволяет пользователям «входить в систему», регистрируясь с тем же адресом электронной почты. (Не волнуйтесь, это не приложение, которое будет работать в Интернете, а также не хранит важные данные. Это временная регистрация и оно будет работать только в локальных сетях.) Предполагается, что метод 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
, который я возвращаю для модульного тестирования метода?
заранее спасибо
Assert.Equal
проверяет ссылочное равенство, если типы являются ссылочными. Не имеет значения, имеют ли все свойства одинаковое значение. Если вы не хотите создавать класс, для которого вы можете переопределитьEquals
, вам придется определять равенство, сравнивая каждое свойство. - person Crowcoder   schedule 09.04.2019