2016-09-29 4 views
0

私の問題を手伝ってください。私は以下の通りであるサービスクラスを持っている:Mock C#を使用して、サービスクラスの特定のメソッドをどのようにテストできますか?

public class RateService:IRatesService 
{ 
    ... 
    public RatesDTO GetById(int Id) 
    { 
     return Mapper.Map<Rates, RatesDTO>(this.db.Rates.GetAll().Where(m => m.RateId == Id).First()); 
    } 
} 

コードのサンプルのようなインターフェースIRatesServicelooks:

public interface IRatesService 
{ 
    ..... 
    RatesDTO GetById(int Id); 
    .... 
} 

そして今、私は公共RatesDTO GetById(int型同上)メソッドをテストしてみてください。私のコードは以下の通りである:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mock<IRatesService> mock = new Mock<IRatesService>(); 
     mock.Setup(m => m.GetById(It.IsAny<int>())).Returns<RatesDTO>(total=>total); 

     Assert.IsNotNull(mock.Object.GetById(1)); 
    } 
} 

しかし、私は、テストを実行すると、私はこのようなエラーが出る:

テスト名:TestMethod1テスト
フルネーム:Provider.Tests.Services.UnitTest1.TestMethod1

結果メッセージ:

試験方法Provider.Tests.Services.UnitTest1.TestMethod1は 例外をスロー:System.ArgumentExceptio n:詳細は、 типа "System.Int32"ктипу "Provider.BLL.DTO.RatesDTO"を参照してください。

サービスのクラスとメソッドをテストするベストプラクティスは何ですか?

+0

RateServiceをテストする場合は、具体的なクラスをテストする必要があります。モックしないようにしてください。モックは、クラスを独立してテストしたいので、クラスに依存するオブジェクトをモックする場合に存在します。 – YuvShap

答えて

0

あなたはモックをテストしようとしています。それは意味をなさない。

実際のコードをテストするよう努めてください。 あなたの場合、GetByIdが正しいId値でRatesDTOを返すようにすることができます。

Mockフレームワークを使用してテストを容易にすることができます。例: 単体テストを実行しようとしているときにDBレイヤーを使用している場合、データベースレイヤーのGetAll関数をモックしていくつかのオブジェクトを返し、正しいオブジェクト(同じID)を実際に返すかどうかを確認するテストを実行することができます。

0

RateServiceはテスト対象のシステムです。単体テスト用のモックを作成するときは、テスト対象のシステムの依存関係を模擬するのが普通です。

現在のサービスでは、データストアに依存していると言えます。

public class RateService : IRatesService { 
    private readonly IDbContext db; 
    public RateService(IDbContext dbContext) { 
     this.db = dbContext; 
    } 
    //... 
    public RatesDTO GetById(int Id) { 
     return Mapper.Map<Rates, RatesDTO>(this.db.Rates.GetAll().Where(m => m.RateId == Id).First()); 
    } 
    //... 
} 

IDbContextは、テスト対象のシステムの依存関係になります。

RateService

[TestClass] 
public class RateServiceUnitTests { 
    [TestMethod] 
    public void Given_ValidId_GetById_Should_Return_Dto() { 
     //Arrange 
     var validId = 1; 
     var fakes = new List<Rates>() { 
      new Rates { RateId = validId } 
     }; 
     var mock = new Mock<IDbContext>(); 
     //Assuming IDbContext.Rates.GetAll() returns an IEnumerable<Rates> 
     mock.Setup(m => m.Rates.GetAll()).Returns(fakes); 
     var sut = new RateService(mock.Object); 
     //Act 
     var result = sut.GetById(validId); 
     //Assert 
     Assert.IsNotNull(result); 
    } 
} 

をテストするときにはそれをモックアップでしょうあなたはまた、マッパーを使用していることに気づきました。テスト用に設定されていることを確認してください。それ以外の場合は、テストは失敗します。クラスで静的呼び出しを使用すると、テストのためにシステムを分離しようとすると問題が発生する可能性があります。依存関係としてマッパーを追加してみてください。

関連する問題