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

У меня есть действие, которое получает данные JSON из Request.Form[0] и имеет вызовы в доменные объекты.

Я тестирую этот метод, но, кажется, невозможно установить Request.Form.

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

Есть ли метод для проверки того или иного, более тестируемого методаполучить данные JSON из $.ajax() вызова?

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Лично я использую MVCContrib TestHelper для модульного тестирования действий моего контроллера. Это делает вещи очень веселыми и легкими.

Таким образом, в вашем случае предполагается, что следующий контроллер (заявление об отказе от ответственности: абсолютно никогда не пишите что-то подобное в реальном приложении, это просто пример здесь, в реальном мире действия контроллера приложения никогда не должны получать данные из Request.Form, они должны использовать строго типизированные параметры действия и оставьте привязку модели по умолчанию для анализа и т. д.):

public class MyViewModel
{
    public string SomeProperty { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var json = Request.Form[0];
        var model = new JavaScriptSerializer().Deserialize<MyViewModel>(json);
        return View(model);
    }
}

Вы можете проверить это так:

// arrange
var builder = new TestControllerBuilder();
var sut = new HomeController();
builder.InitializeController(sut);
builder.Form.Add("foo", "{ someProperty: 'some value' }");

// act
var actual = sut.Index();

// assert
actual
    .AssertViewRendered()
    .WithViewData<MyViewModel>()
    .SomeProperty
    .ShouldEqual("some value", "");
0 голосов
/ 19 января 2011

Можно передать строго типизированный параметр string, записав его в метод, добавив его в качестве параметра

public JsonResult ActionName(string paramName)

и включение его в данные:

var dataVar = getDataVar();
$.ajax({
    url: '/Controller/ActionName'
    , type: 'post'
    , data: { paramName: dataVar }
    , dataType: 'json'

    , success: function (returnJSON) {
    }
    , error: function (XMLHttpRequest, textStatus, errorThrown) {
    //error handle in here
    }
});
...