私はWebAPIをビルドしています。私のテストとは別にPostmanで実行していますが、いくつかの統合/ユニットテストを実装したいと思います。XUnit DIでオーバーライドされたスタートアップファイル(.netコア)
私のビジネスロジックは非常に薄く、ほとんどの場合はCRUDアクションが多いので、私は自分のコントローラーをテストしたいと思っていました。
私は基本的な設定があります。リポジトリパターン(インタフェース)、サービス(ビジネスロジック)、コントローラ フローはコントローラ(DIサービス)→サービス(DIレポ)→レポアクションになります。
私のやったことは、メモリデータベースに変更するためのスタートアップファイルを無効にし、残りはうまくいくはずです(サービスが追加され、reposが追加されています)。私の基本的なテストでは問題ありません。
namespace API.UnitTests
{
public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env)
: base(env)
{
}
public void ConfigureTestServices(IServiceCollection services)
{
base.ConfigureServices(services);
//services.Replace<IService, IMockedService>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
base.Configure(app, env, loggerFactory);
}
public override void SetUpDataBase(IServiceCollection services)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = ":memory:" };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
services
.AddEntityFrameworkSqlite()
.AddDbContext<ApplicationDbContext>(
options => options.UseSqlite(connection)
);
}
}
}
私は私の最初のテストを書いたが、DatasourceServiceはありません。
次のコンストラクタのパラメータは、フィクスチャデータに一致していませんでした:DatasourceService datasourceService何午前
namespace API.UnitTests
{
public class DatasourceControllerTest
{
private readonly DatasourceService _datasourceService;
public DatasourceControllerTest(DatasourceService datasourceService)
{
_datasourceService = datasourceService;
}
[Xunit.Theory,
InlineData(1)]
public void GetAll(int companyFk) {
Assert.NotEmpty(_datasourceService.GetAll(companyFk));
}
}
}
私は行方不明?
IIRCあなたはテストクラスに依存性の注入を使用することはできません。 xunitにはコンストラクタ(https://xunit.github.io/docs/shared-context.htmlクラスとコレクションの備品を参照)を介して特殊なフィクスチャを挿入させるだけです。インテグレーションテストのためには、 'IServiceProvider'のインスタンスを取得してサービスを解決する必要があります。コントローラテストのためには、 'TestServer' class => docs.microsoft.com/en-us/aspnet/core/testing/integration-testing – Tseng
を使う必要があります。また、Startup.csから継承したくないかもしれず、代わりに別のクラス。ブートストラッピングコードを使用してください。特定の構成(つまり、Aの後でBの前にコードを実行する必要がある場合)ではオーバーライドがうまく機能しません。同じサービスを2回登録すると、複数のサービスが登録されているため、 'GetRequiredService'を呼び出すときに例外が発生することがあります(' services.TryAddXxx() ' –
Tseng
)。フィクスチャインスタンスからコンストラクタ引数として追加すると、自動的に提供されますので、FixturesではDIを使用できますが、起動時にDIを使用することはできません。まだテストでスタートアップでDIできるのであれば、テストをして数秒で実行できます。 – Drakoumel