これは私がこのメソッドのために書くことができる唯一のテストです。
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();
}
}