2016-01-26 5 views
0

Я использую шаблоны 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. На данный момент я оставил Устав и Закон вне вопроса, потому что они, похоже, делают то, что должны. Это утверждение не работает.

Как проверить, установлено ли свойство на объекте до вызова метода? Другими словами, как я утверждаю, что что-то произошло в определенном порядке?

  1. Set property.
  2. 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. Любые идеи для лучшего решения?

+0

Мне непонятно, из какого вопроса находится тестируемый объект, что представляет собой издеваемый объект и в чем проблема ... Если метод «SaveChanges» является частью макета, и вы ожидаете, что ваш тестируемый объект будет назовите его, нет проблемы при использовании «AssertWasCalled». Просто не понятно, как связано значение электронной почты? –

+0

Контекст в моем случае является абстракцией DbContext из EntityFramework (и макета). _resultEntity - это объект, который я хочу обновить, используя контекст.Я хочу заверить, что адрес электронной почты был назначен объекту до вызова Context.SaveChanges(). – smoksnes

+0

Итак, вы хотите проверить 2 элемента: 1. был задан адрес электронной почты 2. Вызывается SaveChanges(). Зачем вам их связывать? не можете ли вы иметь только два утверждения (один в настройщике свойств и другой по вызову метода)? –

ответ

0

Похоже, что вы ищете, чтобы проверить порядок ваших макетных звонков. Это возможно было MockRepository.Ordered() метод версии 3.5, но не является частью синтаксиса 3.6.
Вы можете увидеть here и here возможные решения. Это один, вероятно, самый простой для AAA:

Context.AssertWasCalled(x => _resultEntity.Email = "somevalue", options => options.WhenCalled(w => Context.AssertWasNotCalled(x=>x.SaveChanges()))); 
Context.AssertWasCalled(x=>x.SaveChanges()); 
+0

Сущность не является издеваемым объектом, поэтому я не могу запустить AssertWasCalled. – smoksnes

0

Я закончил с этим:

private FooEntity _itemToUpdate; 
private FooEntity _resultEntity; 

protected override void Arrange() 
{ 
    base.Arrange(); 
    var correctValue = "somevalue" 
    _itemToUpdate = new FooEntity() 
    _itemToUpdate.Email = correctValue; 

    // Context is a mock of a DbContext and inherited from base class. 
    Context.Expect(x => x.SaveChanges()).Return(0).WhenCalled(y => 
    { 
     Assert.AreEqual(_resultEntity.Email, correctValue); 
    }); 
    Context.Replay(); 
} 

protected override void Act() 
{ 
    base.Act(); 
    // Repository is a mock of a repository and inherited from base class. 
    _resultEntity = Repository.Update(_itemToUpdate); 
} 

[TestMethod] 
public void ShouldAssignEmailBeforeSave() // Assert 
{ 
    Context.VerifyAllExpectations(); 
} 

Поскольку юридическое лицо не является фиктивный AssertWasCalled не будет работать.

Смежные вопросы