문제

나는 Scott Guthrie의 훌륭한 게시물을 통해 내 길을 가고 있습니다. ASP.NET MVC 베타 1. 그것에서 그는 Updatemodel 방법의 개선 사항과 단위 테스트를 개선하는 방법을 보여줍니다. 비슷한 프로젝트를 재현했지만 UpdateModel에 대한 호출이 포함 된 UnitTest를 실행할 때마다 ControlLerContext 매개 변수의 이름 지정 인 ArgumentNullexception을받습니다.

내 모델부터 시작하는 관련 비트는 다음과 같습니다.

public class Country {
  public Int32 ID { get; set; }
  public String Name { get; set; }
  public String Iso3166 { get; set; }
}

컨트롤러 동작 :

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Int32 id, FormCollection form)
{
  using ( ModelBindingDataContext db = new ModelBindingDataContext() ) {
    Country country = db.Countries.Where(c => c.CountryID == id).SingleOrDefault();

    try {
      UpdateModel(country, form);

      db.SubmitChanges();

      return RedirectToAction("Index");
    }
    catch {
      return View(country);
    }
  }
}

그리고 마지막으로 실패한 내 단위 테스트 :

[TestMethod]
public void Edit()
{
  CountryController controller = new CountryController();
  FormCollection form = new FormCollection();
  form.Add("Name", "Canada");
  form.Add("Iso3166", "CA");

  var result = controller.Edit(2 /*Canada*/, form) as RedirectToRouteResult;

  Assert.IsNotNull(result, "Expected to be redirected on successful POST.");
  Assert.AreEqual("Show", result.RouteName, "Expected to redirect to the View action.");
}

ArgumentNullException 전화로 던져집니다 UpdateModel "값은 null이 될 수 없습니다. 매개 변수 이름 : ControlLerConText"메시지를 사용합니다. 나는 어딘가에 있다고 가정합니다 UpdateModel 필요합니다 System.Web.Mvc.ControllerContext 테스트 실행 중에는 존재하지 않습니다.

나는 또한 어딘가에서 뭔가 잘못하고 있다고 가정하고 올바른 방향을 가리킬 필요가 있다고 가정합니다.

도와주세요!

도움이 되었습니까?

해결책

UpdateModel이 사용하는 TryUpDateModel 이후로 가능하지 않다고 생각합니다. 나는 Rhinomocks를 사용하여 컨트롤러가 필요한 다양한 구성 요소를 조롱하거나 스터브합니다.

var routeData = new RouteData();
var httpContext = MockRepository.GenerateStub<HttpContextBase>();
FormCollection formParameters = new FormCollection();

EventController controller = new EventController();
ControllerContext controllerContext = 
    MockRepository.GenerateStub<ControllerContext>( httpContext,
                                                    routeData,
                                                    controller );
controller.ControllerContext = controllerContext;

ViewResult result = controller.Create( formParameters ) as ViewResult;

Assert.AreEqual( "Event", result.Values["controller"] );
Assert.AreEqual( "Show", result.Values["action"] );
Assert.AreEqual( 0, result.Values["id"] );

다음은 www.codeplex.com/aspnet의 Controller.cs 소스의 관련 비트입니다.

protected internal bool TryUpdateModel<TModel>( ... ) where TModel : class
{

     ....

    ModelBindingContext bindingContext =
           new ModelBindingContext( ControllerContext,
                                    valueProvider,
                                    typeof(TModel),
                                    prefix,
                                    () => model,
                                    ModelState,
                                    propertyFilter );

     ...
}

다른 팁

나는이 같은 문제를 겪고 있었다. TVANFOSSON의 솔루션을 읽은 후 모의 프레임 워크가 포함되지 않은 간단한 솔루션을 시도했습니다.

다음과 같이 컨트롤러에 기본 ControlerContext를 추가하십시오.

CountryController controller = new CountryController();
controller.ControllerContext = new ControllerContext();

이것은 단위 테스트 중에 오류를 잘 제거했습니다. 나는 이것이 다른 사람을 도울 수 있기를 바랍니다.

또는 양식 데이터 프록시를 만들 수 있습니다

public class CountryEdit {
  public String Name { get; set; }
  public String Iso3166 { get; set; }
}
  • 을 더한. 쉬운 단위 테스트를 만듭니다
  • 을 더한. 게시물에서 흰색 필드 업데이트 목록을 정의합니다
  • 을 더한. 쉬운 설정 유효성 검사 규칙, 쉽게 테스트합니다.
  • 마이너스. 프록시에서 모델로 날짜를 이동해야합니다

따라서 Controller.action은 모양이되어야합니다

public ActionResult Edit(Int32 id, CountryEdit input)
{
  var Country = input.ToDb();
  // Continue your code
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top