Сервис Модульного теста, который имеет Вызов WCF (MSUnit + Moq)

Я плохо знаком с Насмешкой и несколько знаком с поблочным тестированием и наконец решил стиснуть зубы на новом проекте, запускающемся впереди со строгого подхода TDD. Однако у меня есть один класс обслуживания и метод, я должен ретроспективно добавить тесты к тому, поскольку он был продвинут от прототипа.

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

public class PageService : IPageService
{
    private readonly ITestService testServiceClient;

    public PageService(ITestService testServiceClient)
    {
        this.testServiceClient = testServiceClient;
    }

    public Page GetPage(Guid websiteId, string pageKey)
    {
        Page builtPage = null;

        // WCF SERVICE CALL I DO NOT WANT EXECUTING WHEN RUNNING UNIT TEST
        // BUT RATHER WANT A BLANK NEW INSTANCE OF "PAGE" CREATED USING MOQ??
        var page = testServiceClient.GetPage(websiteId, pageKey);

        if (page == null)
            return null;

        builtPage = new Page();

        [code here to build builtPage if input params ok] ...

        return builtPage;
    }
}

То, что я пытаюсь сделать, является записью один тест, от этого, надо надеяться, я могу развернуть все перестановки GetPage(...) тесты, но для первого просто тестируют если допустимое websiteId и pageKey был передан в, раз так получите допустимое Page экземпляр назад и утверждает верный для модульного теста.

testServiceClient сервисный клиент WCF, это было перенесено в a using() оператор прежде, но я переместил его из этого в надежде получить его идущий с внедрением зависимости, поскольку я чувствую, что это будет первым шагом, требуемым для тестирования, как от того, что я понимаю, я должен буду дать ему фальшивку / дразнивший? клиент wcf вместо этого, где testServiceClient.GetPage() возвращает известный набор в оперативной памяти данных? Надо надеяться, я на правильном пути там.

Таким образом, вот мои начальные проекты моего модульного теста (я использую платформу Moq, Setup() новая версия Expect() если Вы не использовали последний ver Moq):

/// <summary>
/// Tests service returns a valid instance of type `Page` when a valid website and valid page key is tested.
/// </summary>
[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
    // Arrange
    Page page = null;

    // Act
    var newPage = new Page() { Title = "Mocked Version!?"};

    testServiceClient = new Mock<ITestService>();
    testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);

    service = new PageService(testServiceClient.Object);
    page = service.GetPage(websiteId, "about-us");

    // Assert
    Assert.IsInstanceOfType(page, typeof(Page), "Object was not of expected instance type.");
}

Я понятия не имею, куда пойти отсюда, или если я на правильном пути? Я могу подтвердить, что вышеупомянутое не имеет никаких синтаксических ошибок, и я действительно получаю исключение:

System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetPage(websiteId, "about-us").

Все, что я знаю, - то, что я хочу мой service.GetPage(...) возвратить новый экземпляр, как websiteId и pageKey было допустимо, однако я не хочу, чтобы это использовало реальное testServiceClient.GetPage() WCF звонят..., надо надеяться, я понимаю идею дразнить правильно. Скажите меня это правильно через Moq, когда Вы будете использовать testServiceClient.GetPage на том сервисе на самом деле просто возвратите новый экземпляр страницы?

Любое разъяснение значительно ценится!Спасибо, ребята!

5
задан GONeale 21 December 2009 в 05:12
поделиться

1 ответ

Я бы сказал, что вы на правильном пути. Если ITestService действительно является интерфейсом (как указано в его названии), вы сможете имитировать его.

Однако, когда вы определяете свои настройки, Moq должен иметь возможность определить, какой метод вы имели в виду, и кажется, что вы как-то указать метод, которого нет в интерфейсе.

Вы не показали нам интерфейс ITestService, и мы также не знаем тип переменной websiteId .

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

Я предполагаю, что объявление websiteId каким-то образом конфликтует с объявлением GetPage. Если, например, websiteId был объявлен как объект , Moq будет искать метод с такой сигнатурой:

Page GetPage(object x, string y);

, которая не совпадает с

Page GetPage(Guid x, string y);

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

[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
    // Arrange
    Page page = null;

    // Act
    var newPage = new Page() { Title = "Mocked Version!?"};

    testServiceClient = new Mock<ITestService>();
    testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);

    service = new PageService(testServiceClient.Object);
    page = service.GetPage(websiteId, "about-us");

    // Assert
    Assert.AreEqual(newPage, page);
}

Обратите внимание на гораздо более ценный Assert.

t то же, что и

Page GetPage(Guid x, string y);

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

[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
    // Arrange
    Page page = null;

    // Act
    var newPage = new Page() { Title = "Mocked Version!?"};

    testServiceClient = new Mock<ITestService>();
    testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);

    service = new PageService(testServiceClient.Object);
    page = service.GetPage(websiteId, "about-us");

    // Assert
    Assert.AreEqual(newPage, page);
}

Обратите внимание на гораздо более ценный Assert.

t то же, что и

Page GetPage(Guid x, string y);

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

[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
    // Arrange
    Page page = null;

    // Act
    var newPage = new Page() { Title = "Mocked Version!?"};

    testServiceClient = new Mock<ITestService>();
    testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);

    service = new PageService(testServiceClient.Object);
    page = service.GetPage(websiteId, "about-us");

    // Assert
    Assert.AreEqual(newPage, page);
}

Обратите внимание на гораздо более ценный Assert.

4
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: