ASPNETコアプロジェクトでは、データ検証ロジックが正常に動作することを確認するユニットテストをいくつか作成しようとしています。ユニットテストコントローラモデルの検証AspNetCore
私のコントローラは非常に簡単です:私は、テスト対象のコントローラとして_myController
オブジェクトを設定しますテストの基本クラスを使用しています
[HttpPost]
[Route("Track")]
public void Track([FromBody] DataItem item)
{
if (!ModelState.IsValid) throw new ArgumentException("Bad request");
_dataItemSaver.SaveData(item);
}
。
public ControllerTestBase()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"buildversion.json", optional: true)
.AddEnvironmentVariables();
_config = builder.Build();
var services = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<MyDbContext>(options =>
{
options.UseInMemoryDatabase();
})
.AddScoped<IDataItemSaver, DataItemSQLStorageService>()
.AddScoped<MyController>()
.Configure<MyConfig>(_config.GetSection(nameof(MyConfig)));
services
.AddMvc(mvcOptions =>
{
mvcOptions.Filters.AddService(typeof(GlobalExceptionFilter), 0);
});
_additionalDISetupActions?.Invoke(services);
_serviceProvider = services.BuildServiceProvider();
_myController = _serviceProvider.GetService<MyController>();
}
テストは再び非常に簡単です:
[TestMethod]
public void Prop3Required()
{
// Arrange
var dataItem = new DataItem()
{
Prop1 = "Prop1",
Prop2 = "Prop2"
};
// Act & Assert
Assert.ThrowsException<ArgumentException>(() => _myController.Track(dataItem));
}
私DataItem
が必要な属性(この例ではProp3
)が不足している場合でも、ユニットテストを実行しているときにModelState.IsValid
がtrue
ですが、私が見つけています。同じ入力を使用してWeb経由でコントローラをテストする場合、検証は正常に機能します(ModelState.IsValid
の場合はfalse
を返します)。
単体テストからモデルステート検証用のASPNETコアロジックを正しくトリガするにはどうすればよいですか?
'ModelState'が無効な場合にあなたが本当に例外をスローするつもりはないが、あなたは?を参照してください。 –
グローバル例外フィルタで例外を処理し、すべてのエラー処理と書式設定を同じ場所に保持しました。チェックをフィルタに移動してグローバルに適用できますが、例外をスローしてグローバルフィルタで処理する方法を保ちます。 –
真剣に?ユーザーが検証エラーを訂正できるように、メソッドはビューを戻す必要があります。 –