MVC 很新,所以希望这是一个简单的问题。
我编写了一个自定义绑定属性,需要访问httpContext
. 为了httpContext
在单元测试期间注入模拟,我编写了一个InjectingMetadataProvider
填充Context
我的任何自定义属性的属性。
我已经设法让它在以下测试中工作:
[TestMethod]
public void Marker_ShouldBind_Id()
{
// Arrange
var formCollection = new NameValueCollection
{
{ "id", "2" }
};
var context = new Mock<HttpContextBase>();
context.Setup(c => c.User).Returns((IPrincipal)null);
var metaProvider = new InjectingMetadataProvider(context.Object);
ModelMetadataProviders.Current = metaProvider; //why do I need this?
var bindingContext = new ModelBindingContext
{
ModelName = string.Empty,
ValueProvider = new NameValueCollectionValueProvider(formCollection, null),
ModelMetadata = metaProvider.GetMetadataForType(null, typeof(Marker)),
};
var binder = new DefaultModelBinder();
// Act
var marker = (Marker)binder.BindModel(new ControllerContext(), bindingContext);
// Assert
marker.Id.Should().Be(2);
}
但是,如果我注释掉将 my 设置InjectingMetadataProvider
为的行ModelMetadataProviders.Current
,那么我的InjectingMetadataProvider.CreateMetadata()
覆盖将获得一个空白的属性列表,因此测试失败,因为我的自定义属性没有设置它们的上下文。
为什么我需要将它设置为Current
当我明确使用它时?我不想在我的测试中设置静态的东西。
我可能正在做一些愚蠢的事情,因为由于我对框架的不熟悉,我现在有点摸不着头脑。