2

私はRESTサービスをユニットテストするためにいくつかのアプローチを試しましたが、役に立ちませんでした。

  1. この投稿に続いて、DirectServiceClientを作成しましたが、「メソッドが実装されていません」という例外が発生しました。

  2. Webサービスを直接インスタンス化し、Any()メソッドを呼び出したところ、機能しましたが、DBにヒットしました。以下のようにセットアップで接続を初期化しました。しかし、接続オブジェクトをモックしてメモリ内の顧客オブジェクトを設定する方法がわかりません。

    _dbConnection = new OrmLiteConnectionFactory(TestConfig.ConnectionString、SqlServerDialect.Provider).OpenDbConnection();

誰かがこの種のシナリオでユニットテストを書く方法についていくつかのインプットを提供できますか?

顧客サービス

public class CustomerService : Service
{
   private readonly IDbConnection _dbConnection;

   public CustomerService(IDbConnection dbConnection)
   {
       _dbConnection = dbConnection;
   }

   public object Any(CustomerRequest request)
   {
      if (request.id == null)
      {
          throw new ArgumentException("id is required");
      }

      var customer = _dbConnection.QueryDapper<Customer>("getCustomer",new {@id=request.id}).ToList();

      return customer;
   }
}

リクエスト

[Route("/customers")]
[Route("/customer/{id}")]
public class CustomerRequest : IReturn<Customer>
{
    public string id { get; set; }
}
4

2 に答える 2

3
  1. DirectServiceClientは、統合テスト(つまり、エンドツーエンド)でより多く使用されていると思います。

  2. モックツールを使用して、データベースをスタブアウトします。結局のところ、この単体テストでは、「Any」メソッドのみをテストする必要があります。

[Test]
public void Any_CalledWithoutId_ExpectThrowArgumentException()
{
  var db = MockRepository.GenerateStub<IDbConnection>();
  var request = new CustomerRequest();
  var service = new CustomerService(db);

  Assert.Throws<ArgumentException>(() => service.Any(request));
}

それは大まかにそれです。(申し訳ありませんが、abtフォーマット.... SOOフォーマッターが動作していないため、引用をブロックします)

于 2013-03-26T22:16:00.400 に答える
2

これは私がこのメソッドのために書くことができる唯一のテストです。

ozczehcoの答えは、例外をスローするコードパスをテストします。例外を超えて移動するコードパスをテストする場合は、_dbConnection.QueryDapper呼び出しをモック/スタブする必要があります。

以下は、テスト「Any_CalledWithAnId_ReturnsCustomer()」を追加することによってozczechoの回答を拡張しており、すべての「式典」が含まれています。私はあなたが提供したコードのいくつかのことを変更しました。新しいテストのためにIDbConnectionをモック/スタブする代わりに、テストのためだけにInMemoryTestDatabaseを作成しました。テストのために「顧客」テーブルを消去するため、これを自分のデータベースに対して使用しないでください。

[TestFixture]
public class CustomerServiceTest
{
    public IDbConnectionFactory InMemoryTestDatabase;

    [SetUp]
    public void SetUp()
    {
        InMemoryTestDatabase = new OrmLiteConnectionFactory("c:\\testData.db", SqliteDialect.Provider);
    }

    [Test]
    public void Any_CalledWithoutId_ExpectThrowArgumentException()
    {
        var db = MockRepository.GenerateStub<IDbConnection>();
        var request = new CustomerRequest();
        var service = new CustomerService(db);

        Assert.Throws<ArgumentException>(() => service.Any(request));
    }

    [Test]
    public void Any_CalledWithAnId_ReturnsCustomer()
    {
        //Arrange your data
        long requestId;
        using (var con = InMemoryTestDatabase.OpenDbConnection())
        {
            con.CreateTable<Customer>(true); //Force drop to create clean table and data
            con.Insert<Customer>(new Customer { FirstName = "Johnny", LastName = "Test"});
            requestId = con.GetLastInsertId();
        }

        //Act
        var request = new CustomerRequest {id = (int)requestId};
        var service = new CustomerService(InMemoryTestDatabase.OpenDbConnection());
        var result = (Customer)service.Any(request);

        //Assert
        Assert.AreEqual(requestId, result.Id);
        Assert.AreEqual("Johnny", result.FirstName);
    }
}


[Route("/customers")]
[Route("/customer/{id}")]
public class CustomerRequest : IReturn<Customer>
{
    public long id { get; set; }
}

public class Customer
{
    [AutoIncrement]
    public long Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class CustomerService : ServiceStack.ServiceInterface.Service
{
    private readonly IDbConnection _dbConnection;

    public CustomerService(IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
    }

    public object Any(CustomerRequest request)
    {
        if (request.id == null)
        {
            throw new ArgumentException("id is required");
        }

        var customer = _dbConnection.QueryDapper<Customer>("Select * From Customer Where Id = @id", new { id = request.id }).ToList();

        return customer.FirstOrDefault();
    }
}
于 2013-03-27T23:14:22.170 に答える