Dapper:SQLクエリをテストするユニット

.net c# dapper tdd unit-testing

質問

私はDapper、マイクロORMから始めています。私はDapper Rainbowを使っています。クエリとそれらによって取得されたデータをテストしたい。

たとえば、 GetAll()メソッドを持つUserServiceがあり、SQLクエリがすべてのユーザーをいくつかのリスト(データベースからではなく、テストを高速にするため)から取得していることをテストしたいとします。私はそれをどうやってすることができるか知っていますか?

私のサービスクラス(と私がテストしたいメソッド):

public static class UserService{
    public static IEnumerable<User> GetAll(){
        return DB.Users.All();
    }
}

単体テストのクエリとデータ取得に関するアドバイスはありますか?

ありがとう

人気のある回答

私は依存性注入とリポジトリのパターンを読むことをお勧めします。上のコードのようなアプローチをとった場合、クラスとメソッドは静的であるため、依存関係を模擬するのは難しいでしょう。

ここには良いアプローチがあります。

public interface IUserRepository
{
   IEnumerable<User> GetAll()
}

public class UserRepository : IUserRepository
{
  public IEnumerable<User> GetAll()
  { 
    return DB.Users.All();
  }
}

public class UserService
{
    IUserRepository _userRepository;
    public UserService(IUserRepository userRepository)
    {
      _userRepository = userRepository
    }

    public Enumerable<User> GetAll(){
        return _userRepository.GetAll();
    }
}

テストのために、あなたのリポジトリを模倣することができます。私は、NSubstituteという名のフレームワークを使用しています。私の考えでは、上記のものよりもずっと簡単ですが、それは個人的な好みです。ここから始めるには、フレームを模擬しないでテストを書く方法があります。

public class FakeUserRepository : IUserRepository
{
  public IEnumerable<User> GetAll()
  { 
    return new List<User> { new User {FirstName='Bob', LastName='Smith'}, };
  }
}

あなたのテストで

[Test]
public void GetAll_ShouldReturnAllFromFake()
{
   // Arrrange
   var userService = new UserService(new FakeUserRepository())
   // Act
   var result = userService.GetAll();
   // Assert
   var user = result[0];
   Assert.AreEqual("Bob", user.FirstName);
   Assert.AreEqual("Smith", user.LastName);   
}

この例は、偽のリポジトリからデータを取得できることをテストするのは実際には意味がないので、少し工夫しています。実際にこれをどのように使用するかは、サービスにユーザーを戻し、特定の年齢以上の年齢であることを確認するビジネスロジックがある場合です。例えばUserService上のIsLegalDrivingAgeメソッド。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ