Как я могу проверить, что правильное представление возвращается с MVC ASP.NET?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу проверить, что правильное представление возвращается с MVC ASP.NET?

Сообщение Anonymous »

Я новичок в MVC, модульном тестировании, издевании и TDD. Я стараюсь как можно ближе следовать передовой практике. < /p>

Я записал модульный тест для контроллера, и у меня возникают проблемы с тестированием, если возвращается правильное представление. Если я использую ViewResult.viewName, тест всегда сбой, если я не укажу имя представления в контроллере. Если я укажу имя ViewName в контроллере, тест всегда проходит, даже если представление не существует. < /p>

Я также попытался проверить код response.status, однако это всегда возвращает 200 (код, взятый из ответа Дарина Димитров на код ответа на модульный тестирование MVC3). Я стремлюсь к классическому красному, зеленому рефактору при создании нового представления и избегаю ошибок 404 и System.invalidoperationException при запуске, это возможно?public class BugStatusController : Controller
{
public ActionResult Index(){
return View(); // Test always fails as view name isn’t specified even if the correct view is returned.
}

public ActionResult Create(){
return View("Create"); // Test always passes as view name is specified even if the view doesn’t exist.
}
}

[TestFixture]
public class BugStatusTests
{
private ViewResult GetViewResult(Controller controller, string controllerMethodName){
Type type = controller.GetType();
ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);

object instance = constructor.Invoke(new object[] {});
MethodInfo[] methods = type.GetMethods();

MethodInfo methodInfo = (from method in methods
where method.Name == controllerMethodName
&& method.GetParameters().Count() == 0
select method).FirstOrDefault();

Assert.IsNotNull(methodInfo, "The controller {0} has no method called {1}", type.Name, controllerMethodName);

ViewResult result = methodInfo.Invoke(instance, new object[] {}) as ViewResult;

Assert.IsNotNull(result, "The ViewResult is null, controller: {0}, view: {1}", type.Name, controllerMethodName);

return result;
}

[Test]
[TestCase("Index", "Index")]
[TestCase("Create", "Create")]
public void TestExpectedViewIsReturned(string expectedViewName, string controllerMethodName){
ViewResult result = GetViewResult(new BugStatusController(), controllerMethodName);

Assert.AreEqual(expectedViewName, result.ViewName, "Unexpected view returned, controller: {0}, view: {1}", CONTROLLER_NAME, expectedViewName);
}

[Test]
[TestCase("Index", "Index")]
[TestCase("Create", "Create")]
public void TestExpectedStatusCodeIsReturned(string expectedViewName, string controllerMethodName)
{
var controller = new BugStatusController();
var request = new HttpRequest("", "http://localhost:58687/", "");
var response = new HttpResponse(TextWriter.Null);
var httpContext = new HttpContextWrapper(new HttpContext(request, response));
controller.ControllerContext = new ControllerContext(httpContext, new RouteData(), controller);

ActionResult result = GetViewResult(controller, controllerMethodName);

Assert.AreEqual(200, response.StatusCode, "Failed to load " + expectedViewName + " Error: " + response.StatusDescription);
}
}


Подробнее здесь: https://stackoverflow.com/questions/132 ... vc-asp-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»