Moq для обучения c # не работает на первом тесте в комплекте - PullRequest
0 голосов
/ 01 октября 2011

Я новичок в c #, а также в Moq Framework.Я использую VS 2010 express и NUnit

В моей функции [Setup] у меня есть:

    this.mockAllianceController = new Mock<AllianceController>();
    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>());

    ...

    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);

Первый тест в наборе возвращает ноль, а каждый тест после этогополучает пустой список.Чего мне не хватает?

Обновление:

Тестируемый код:

    public void ApplyRelations() {
        List<string> allies = this.AllianceController.getAllies(this.RealmName);
        foreach (string ally in allies) {
            ...
        }
    }

    public virtual List<string> getAllies(string realm) {
        ...
    }

Два теста:

    [Test]
    public void aTest() {
        this.testObj.ApplyRelations();
    }

    [Test]
    public void bTest() {
        this.testObj.ApplyRelations();
    }

aTest генерирует исключение NullReferenceException, в то время как bTest проходит нормально.Любая помощь?

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Было бы полезно, если бы вы также показали объявление getAllies и что такое this.currentRealm.

Но вы, вероятно, захотите изменить строку:

this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>());

на эту:

this.mockAllianceController.Setup(ac => ac.getAllies(It.IsAny<string>())).Returns(new List<string>());

Обратите внимание на It.IsAny<string>() в качестве параметра для getAllies().

0 голосов
/ 02 октября 2011

Я думаю, что ваши настройки выполнены в неправильном порядке, и это приводит к тому, что настройка не действительна в первом тестовом запуске, а затем во втором тестовом запуске this.testObj = new DiplomacyLogic(this.mockAllianceController.Object); уже создан и установка инициализирована.Это означает, что вы должны инициализировать DiplomacyLogic перед настройкой, чтобы получить желаемый результат.

Я также включил код разрыва, чтобы вы получали свежие объекты для каждого теста, это хорошая практика, чтобы тесты не зависели отeachother.

попробуйте приведенный ниже код.

[Setup]   
public void Setup()
{
    this.mockAllianceController = new Mock<AllianceController>();
    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);

    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new         List<string>());
}

[TearDown]
public void TearDown()
{
    this.mockAllianceController = null;
    this.testObj = null;
}

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

0 голосов
/ 01 октября 2011

Если AllianceController является классом, а не интерфейсом, вы можете сделать следующее:

this.mockAllianceController = new Mock<AllianceController>();
this.mockAllianceController.CallBase = True

это означает, что вы создаете объект Mock, который обернет существующий объект и отобразит все вызовы метода наисходный объект по умолчанию (если не был вызван явный Setup)

(см. http://code.google.com/p/moq/wiki/QuickStart#Customizing_Mock_Behavior)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...