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);
}
InjectingMetadataProvider
ただし、 my toを設定する行をコメントアウトするとModelMetadataProviders.Current
、InjectingMetadataProvider.CreateMetadata()
オーバーライドに属性の空のリストが渡され、カスタム属性にコンテキストが設定されないため、テストが失敗します。
Current
とにかく明示的に使用しているときに、なぜそれを設定する必要があるのですか? テストで静的なものを設定したくありません。
フレームワークに不慣れなため、現時点では少し暗闇の中で感じているので、私は何か愚かなことをしているかもしれません.