2017-01-17 12 views
1

У меня есть этот класс:C# Nunit Moq Невозможно сделать тестовый проход

class MyClass 
{ 
    private ISomeInterface blabla; 

    public MyClass() : this(new SomeInterfaceImplementation()) {} 

    internal MyClass(ISomeInterface blabla) 
    { 
     this.blabla = blabla; 
    } 

    public void SomeMethod(string id, int value1, int value2) 
    { 
     this.blabla.DoSomethingWith(id, new ValueClass(value1, value2)) 
    } 
} 

У меня также есть этот тест:

[TestFixture] 
public class MyClassTest 
{ 
    private const string ID = "id"; 
    private const int VALUE1 = 1; 
    private const int VALUE2 = 2; 

    private ValueClass valueClass; 

    private Mock<ISomeInterface> mockInterface; 

    private MyClass myClass; 

    [SetUp] 
    public void SetUp() 
    { 
     this.valueClass = new ValueClass(VALUE1, VALUE2); 
     this.mockInterface = new Mock<ISomeInterface>(); 
     this.myClass = new MyClass(this.mockInterface.Object); 
    } 

    [Test] 
    public void GIVEN_AnID_AND_AValue1_AND_AValue2_WHEN_DoingSomeMethod_THEN_TheSomeInterfaceShouldDoSomething() 
    { 
     this.myClass.SomeMethod(ID, VALUE1, VALUE2); 
     this.mockInterface.Verify(m => m.DoSomethingWith(ID, this.valueClass), Times.Once()); //<- Test fails here! 
    } 
} 

Я не знаю, почему, но я не могу получить этот тест проходить. NCrunch дает мне следующее сообщение об ошибке:

Moq.MockException: Прогнозный вызов на издеваться один раз, но был 0 раз: м => m.DoSomethingWith ("ID", .valueClass) Нет расстановок сконфигурированные ,

Выполненные вызовы:

ISomeInterface.DoSomethingWith ("ID", MyNamespace.ValueClass) при Moq.Mock.ThrowVerifyException (MethodCall ожидалось, IEnumerable 1 setups, IEnumerable 1 actualCalls, выражение Выражение, Времена раза, Int32 CallCount) на Moq.Mock.VerifyCalls (перехватчик targetInterceptor, MethodCall ожидается, выражение Expression, времена раз) при Moq.Mock.Verify [T] (Тестовая модель 1 1 mock, Expression выражения, времена раза, String failMessage) на Moq.Mock выражение, времена) at Tests.MyClassTest.GIVEN_AnID_AND_AValue1_AND_AValue2_WHEN_DoingSomeMethod_THEN_TheSomeInterfaceShouldDoSomething() в C: \ MySourceCode \ Номер файла и строки здесь.

Как вы можете видеть, похоже, Moq «не видит» мой вызов, вероятно, из-за new ValueClass(value1, value2), как я могу сделать этот тест пройти или как я могу изменить свой дизайн, так что легче проверить? Где я должен положить new ValueClass(value1, value2)?

EDIT:

Это вопрос, который я должен спросить по разработке программного обеспечения вместо StackOverflow? Разве это невозможно?

+0

Он пытается сравнить различные классы значений, которые находятся в тестируемом методе. используйте 'It.Any ()'. вы также можете применить предикат, если хотите сравнить поля/свойства, если они открыты. – Nkosi

ответ

1

Ваша проблема не соответствует аргументу в вызове метода: this.valueClass по умолчанию не равен new ValueClass(value1, value2), потому что это будут два разных экземпляра ValueClass. И по умолчанию два экземпляра будут сравниваться по ссылкам, которые отличаются друг от друга. Вы можете:

  • Override Equals и GetHashCode методы в ValueClass, чтобы изменить способ, как по сравнению два экземпляра. То есть сравнивайте значения вместо сравнения по ссылкам.
  • Игнорировать этот аргумент It.Any<ValueClass>(). Это хорошо, если вам не нужны конкретные значения ValueClass и просто нужно проверить метод. Не всегда лучший вариант
  • Использовать предикат для проверки значений ValueClass вручную: It.Is<ValueClass>(vc => vc.Value1 == VALUE1 && vc.Value2 == VALUE2). Иногда это тоже хорошо. Например. если вы не можете переопределить Equals. Но это делает тесты намного менее удобочитаемыми.
+1

Я просто переопределяю (переопределяет, переопределяет?) Equals() и GetHashCode() для ValueClass. Тест проходит! Благодаря! – Sebastien

+0

Не знал, что вы можете добавить предикат! Я предполагаю, что вместо этого буду использовать предикаты, потому что мне придется добавить тесты для Equals(), и мне бы этого не хотелось. – Sebastien

+1

@Sebastien вы можете, но имейте в виду повторяемость ваших тестов. Они могут стать очень загроможденными. Также представьте - у вас есть 50 тестов, которые проверяют значения в предикате. И затем вы добавляете новое поле в ValueClass. С Equals вы просто меняете перегрузку. С предикатом вам нужно обновить 50 тестов. –

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

  • Нет связанных вопросов^_^