asp.net mvc и linq для сущностей: как протестировать пользовательскую привязку модели? - PullRequest
1 голос
/ 30 ноября 2009

Я пытаюсь создать тест для моей пользовательской модели, но безуспешно. Вызов base.BindModel всегда возвращает ноль. Есть ли способ проверить пользовательскую привязку при использовании LINQ to Entities? В этом случае foo представляет собой таблицу в БД с двумя полями - числовым и текстовым значением.

fooBinder.cs:

public override Object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
  var obj = (foo)base.BindModel(controllerContext, bindingContext);
  return obj;
}

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

fooBinderTest.cs:

fooBinder binder;
ControllerContext controllerContext;
ModelBindingContext bindingContext;

[TestInitialize]
public void Initialize()
{
  controllerContext = MockControllerContext().Object;

  FormCollection form = new FormCollection
      {
        {"foo_A","2" },
        {"foo_B", "FooB" }
      };
  var valueProvider = form.ToValueProvider();

  bindingContext = new ModelBindingContext()
  {
    ModelState = new ModelStateDictionary(),
    ModelType = typeof(foo),
    ModelName = "foo",
    ValueProvider = valueProvider
  };

  binder = new fooBinder();

}

public static Mock<ControllerContext> MockControllerContext()
{
  var context = new Mock<ControllerContext>();
  var sessionState = new Mock<HttpSessionStateBase>();
  var response = new Mock<HttpResponseBase>();
  var request = new Mock<HttpRequestBase>();
  var serverUtility = new Mock<HttpServerUtilityBase>();

  var form = new FormCollection
        {
        {"foo_A","2" },
        {"foo_B", "FooB" }
        };

  context.Setup(c => c.HttpContext.Session).Returns(sessionState.Object);
  context.Setup(c => c.HttpContext.Response).Returns(response.Object);
  context.Setup(c => c.HttpContext.Request).Returns(request.Object);
  context.Setup(c => c.HttpContext.Server).Returns(serverUtility.Object);
  context.Setup(c => c.HttpContext.User.Identity.Name).Returns("Test");
  context.Setup(c => c.HttpContext.Request.Form).Returns(form);

  return context;
}


[TestMethod]
public void TestDefault()
{
  foo myFoo = (foo)binder.BindModel(controllerContext, bindingContext);
  Assert.IsNotNull(myFoo);
}

1 Ответ

1 голос
/ 30 ноября 2009

L2E здесь красная сельдь.

Вы должны указать свой пользовательский механизм связывания моделей, поскольку в тесте не работает инфраструктура MVC.

Вот как я это делаю (MVC 2; 1 немного отличается).

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState)
    {
        var mbc = new ModelBindingContext()
        {
            ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T)),
            ModelName = prefix,
            ModelState = modelState,
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new MyCustomModelModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection)
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...