Я использую шаблоны AAA и Rhino для моего модульного тестирования. Я хочу утверждать, что определенное значение (электронная почта) было установлено на сущности до того, как я вызову SaveChanges() в DbContext. У меня есть тест-метод, который выглядит следующим образом:Утверждение, что значение было присвоено перед вызовом метода
protected override void Arrange()
{
base.Arrange();
_itemToUpdate = new FooEntity();
}
protected override void Act()
{
base.Act();
_resultEntity = Repository.Update(_itemToUpdate);
}
[TestMethod]
public void ShouldAssignEmailBeforeSave() // Act
{
Context.AssertWasCalled(x => x.SaveChanges(),
options => options.WhenCalled(y =>
Assert.IsTrue(_resultEntity.Email == "somevalue")));
}
Но я, понимая, что «WhenCalled» -метод не выполняется, потому что я также попытался это:
[TestMethod]
public void ShouldAssignEmailBeforeSave()
{
Context.Expect(x => x.SaveChanges())
.WhenCalled(y => Assert.IsTrue(false));
}
Я также попробовал этот синтаксис:
[TestMethod]
public void ShouldAssignEmailBeforeSave()
{
Context.AssertWasCalled(x => x.SaveChanges(),
options => options.WhenCalled(z => Assert.IsTrue(false)));
}
и утверждает, над проходами, что делает очевидным, что я не использую в WhenCalled
правильно. Context
- это издевавшийся объект моего DBSet. На данный момент я оставил Устав и Закон вне вопроса, потому что они, похоже, делают то, что должны. Это утверждение не работает.
Как проверить, установлено ли свойство на объекте до вызова метода? Другими словами, как я утверждаю, что что-то произошло в определенном порядке?
- Set property.
- SaveChanges.
EDIT:
"ошибка" происходит потому, что Утверждай делается после того, как Закон, который является правильным. Невозможно использовать WhenCalled
в Assert, потому что закон уже произошел. В этом конкретном случае WhenCalled никогда не будет вызываться, поскольку делегат создается после вызова SaveChanges
и, следовательно, не существует при вызове.
Альтернативой является использование Expect
в Упорядочить:
protected override void Arrange()
{
base.Arrange();
_itemToUpdate = new FooEntity();
Context.Expect(x => x.SaveChanges()).Return(0).WhenCalled(y =>
{
Assert.IsTrue(false);
});
}
[TestMethod]
public void ShouldCallSaveChanges()
{
Context.VerifyAllExpectations();
}
Но тогда у вас есть утвердить в ходе Устройте, который я считаю, идет вразрез с лучшими практиками шаблона AAA. Любые идеи для лучшего решения?
Мне непонятно, из какого вопроса находится тестируемый объект, что представляет собой издеваемый объект и в чем проблема ... Если метод «SaveChanges» является частью макета, и вы ожидаете, что ваш тестируемый объект будет назовите его, нет проблемы при использовании «AssertWasCalled». Просто не понятно, как связано значение электронной почты? –
Контекст в моем случае является абстракцией DbContext из EntityFramework (и макета). _resultEntity - это объект, который я хочу обновить, используя контекст.Я хочу заверить, что адрес электронной почты был назначен объекту до вызова Context.SaveChanges(). – smoksnes
Итак, вы хотите проверить 2 элемента: 1. был задан адрес электронной почты 2. Вызывается SaveChanges(). Зачем вам их связывать? не можете ли вы иметь только два утверждения (один в настройщике свойств и другой по вызову метода)? –