Sqlite を使用して ServiceStack サービスの単体テストを作成しようとしています。Sqlite はストアド プロシージャをサポートしていないため、コマンド テキストとコマンド タイプを入力として受け取るタイプ 'ServiceCommand' のパブリック プロパティを作成しました。デフォルトでは、ストアド プロシージャを実行するように構成されており、単体テスト ケースの作成中に、以下のようにAny()
メソッドを呼び出す前に、SelectCommand プロパティを sqlite に対する sql クエリに再割り当てしています。すべてのテストケースは正常に動作します。
var request = new CustomerRequest() { name = "alfki" };
var service = new CustomerService(InMemoryTestDatabase.OpenDbConnection());
service.SelectCommand = new ServiceCommand() { SQL = "SELECT * FROM customers where customerid = {0}" };
var result = service.Any(request);
しかし、このスレッドによると、CustomerService のパブリック プロパティは、参照の解決中に IOC によって null に設定されるため、メソッドで SelectCommand が null にAny()
なり、オブジェクト参照エラーが発生します。プロパティを protected、private、internal、または static に設定すると、単体テストを実行できなくなります。
public class CustomerService : Service
{
private readonly IDbConnection _dbConnection;
public ServiceCommand SelectCommand {get;set;}
public CustomerService(IDBConnection dbConnection)
{
_dbConnection = dbConnection; //injected successfully
SelectCommand = new ServiceCommand(){ SQL = "sp_getcustomers",
CommandType = CommandType.StoredProcedure};
}
public Customer Any(CustomerRequest request)
{
//Select command is not accessible here.
}
}
[Route("/customers")]
public class CustomerRequest
{
public string name { get; set; }
}
ServiceCommand
public class ServiceCommand
{
public string SQL { get; set; }
public CommandType CommandType { get; set; }
public ServiceCommand()
{
CommandType = CommandType.Text;
}
}
テスト ケースとサービスも実行できるようにするために、Any()
メソッドを変更して、null の場合は ServiceCommand をインスタンス化しました。これが進むべき道なのか、それともより良い代替案があるのか を知りたいです。
public class CustomerService : Service
{
private readonly IDbConnection _dbConnection; // injected successfully
public ServiceCommand SelectCommand {get;set;}
public CustomerService(IDBConnection dbConnection)
{
_dbConnection = dbConnection; //injected successfully
}
public Customer Any(CustomerRequest request)
{
SelectCommand = SelectCommand ?? new ServiceCommand() { SQL = "sp_getCustomers",CommandType = CommandType.StoredProcedure };
}
}