Какой самый простой способ написать модульный тест, который отправляет данные Request.Form на мой контроллер? - PullRequest
1 голос
/ 07 сентября 2011

Обычно я хочу установить около 20 значений Request.Form, отправить POST на мой контроллер и проверить результат.

Я нашел пару статей, таких как this которые описывают, как вы можете сделать это с помощью комбинации NUnit, MVCContrib и Rhino Mocks.Но я не знаю, действительно ли это необходимо.

Казалось бы, Visual Studio 2010 и ASP.NET MVC 2 должны иметь возможность делать это изначально и отображать результаты в небольшом окне «Результаты теста».Фактически, когда я создаю новый модульный тест с помощью мастера, он приходит к следующему ...

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("G:\\Webs\\MyWebsite.com\\MyWebsite", "/")]
[UrlToTest("http://localhost:43383/")]
public void PaypalIPNTest()
{
    BuyController target = new BuyController(); // TODO: Initialize to an appropriate value
    ActionResult expected = new EmptyResult(); // TODO: Initialize to an appropriate value
    ActionResult actual;
    actual = target.PaypalIPN();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

Возможно ли передать target.PaypalIPN() мои переменные Request.Form на основе приведенного выше кода?Или мне нужно полагаться на сторонние библиотеки, чтобы сделать это?

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

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

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

Итак, начнем с рассмотрения этого:

Возможно ли передать target.PaypalIPN () мои переменные Request.Form

Читая это предложение, я предполагаю, что действие вашего контроллера выглядит примерно так:

[HttpPost]
public ActionResult PaypalIPN()
{
    string foo = Request["foo"];
    string bar = Request["bar"];
    ... do something with foo and bar
}

Итак, первое - улучшить этот код, введя модели представления:

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

изатем измените сигнатуру вашего метода следующим образом:

[HttpPost]
public ActionResult PaypalIPN(MyViewModel model)
{
    ... do something with model.Foo and model.Bar
}

Теперь ваш контроллер отделен от любого кода инфраструктуры HttpContext (который действительно должен быть оставлен за рамками, действия вашего контроллера не являются обязанностью читать параметры запроса =>это очень простой вопрос:

[TestMethod()]
public void PaypalIPNTest()
{
    // arrange
    var sut = new BuyController();
    var model = new MyViewModel
    {
        Foo = "some foo",
        Bar = "some bar",
    };

    // act
    var actual = sut.PaypalIPN(model);

    // assert
    // TODO:
}

ОК, как говорится, здесь мы имеем дело с очень простым действием контроллера.Для более сложных сценариев вы действительно должны рассмотреть возможность использования фреймворка.Лично я использую MvcContrib.TestHelper с Rhino Mocks для модульного тестирования моих приложений ASP.NET MVC.

0 голосов
/ 07 сентября 2011

У меня есть другой подход для тестирования моего приложения MVC, сначала я использовал Dev Magic Fake для подделки любого слоя подчеркивания под контроллером до тех пор, пока приложение не запущено и бизнес не утвержден, а затем я заменяю поддельный код подходом TDD на основе утвержденноготребования

См. Dev Magic Fake на CodePlex:

http://devmagicfake.codeplex.com/

Спасибо

M.Radwan

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