2012-04-17 2 views
1

У меня есть частный метод, который вызывается в методе, который я тестирую. Я хочу проверить, что правильные параметры передаются этому частному методу. Я написал следующую настройку в Moq, которая проверит то, что я хочу, однако это не позволяет мне следовать шаблону Arrange, Act, Assert.Есть ли лучший способ написать этот тест с Moq?

Есть ли способ, которым я могу выполнить аналогичный тест, когда утверждение может появляться со всеми моими другими утверждениями? На данный момент код находится в рамках соглашения.

 myClass.Setup(
       x => 
       x.myMethod(
        It.IsAny<Person>>(), 
        It.IsAny<string>(), 
        It.IsAny<Person>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<ICollection<string>>(), 
        It.IsAny<bool>())).Callback 
       <Person, string, Person, Person, ICollection<string>, bool>(
        (a, b, c, d, e, f) => 
         { 
          Assert.AreEqual("NameA", a.Name); 
          Assert.AreEqual("StringB", b); 
          Assert.AreEqual("NameC", c.Name); 
          Assert.AreEqual(2, d); 

          var dList = d.ToList().OrderBy(x => x.Name); 
          Assert.AreEqual("PersonA", dList[0].Name) 
          Assert.AreEqual("PersonB", dList[1].Name); 
         }); 

Я должен сказать, я знаю, что вы можете perfom с проверкой, чтобы проверить, был ли метод был вызван с некоторыми входами, однако я не знаю ни одного способа сопоставления ICollection Params.

ответ

3

Если вы используете эти утверждения для проверки параметров, вы можете сделать это в своей настройке. Если ваш макет использует строгое поведение, он будет терпеть неудачу, если параметр не соответствует предикату.

// declare your mock with strict behavior 

myClass.Setup(
    x => 
    x.myMethod(
     It.Is<Person>(person => person.Name == "NameA"), 
     "Stringb", 
     It.Is<Person>(person => person.Name == "NameC"),, 
     It.Is<ICollection<string>>(coll =>{ 
       //your other validations 
      }), 
     It.IsAny<ICollection<string>>(), 
     It.IsAny<bool>())); 
2

Целью единичных тестов является проверка того, что ваш класс ведет себя так, как ожидалось. Вы должны осуществлять класс через его открытый интерфейс и проверить следующие вещи:

  • класс состояния изменяется
  • вернулся результаты
  • вызовы зависимостей

Другие вещи не имеет значения, в то время как класс ведет себя, как и ожидалось. Вы можете реорганизовать свой класс и сделать этот частный метод в режиме онлайн.

+0

привет, спасибо за комментарий. Вы правы, я не должен тестировать частные методы. Я допустил ошибку при написании примера, на самом деле это была зависимость, которую я пытался проверить. Ответ, данный Уфуком, помогает в этом случае. – user460667

+0

@ user460667 не проблема, просто посоветуйте другим не тестировать, что не следует тестировать :) –

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