2

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 };

  }
}
4

1 に答える 1