2017-08-04 6 views
1

私はTDD開発の新人です.Nunit 3.7.1、Newtonsoft.Jsonバージョン= 10.0.3、JustMock Liteバージョン2016.2.426.1、C#、および.NET Framework 4.7。このテストではIGenericRepositoryの模擬方法

public class LoadFinishedTrzlBatch 
{ 
    private IGenericRepository<ProductionOrder> proOrdRepository; 
    private IGenericRepository<Batch> batchRepository; 
    private IGenericRepository<Code> codeRepository; 
    private IGenericRepository<Aggregation> aggregationRepository; 
    private IGenericRepository<AggregationChildren> aggChildrenRepository; 

    public LoadFinishedTrzlBatch(
     IGenericRepository<ProductionOrder> proOrdRepository, 
     IGenericRepository<Batch> batchRepository, 
     IGenericRepository<Code> codeRepository, 
     IGenericRepository<Aggregation> aggregationRepository, 
     IGenericRepository<AggregationChildren> aggChildrenRepository) 
    { 
     this.proOrdRepository = proOrdRepository; 
     this.batchRepository = batchRepository; 
     this.codeRepository = codeRepository; 
     this.aggregationRepository = aggregationRepository; 
     this.aggChildrenRepository = aggChildrenRepository; 
    } 

    public bool ExistsProductionOrder(string productionOrderName) 
    { 
     if (string.IsNullOrWhiteSpace(productionOrderName)) 
      throw new ArgumentNullException(nameof(productionOrderName)); 

     return (
      proOrdRepository 
       .SearchFor(p => p.Name == productionOrderName) 
       .FirstOrDefault() != null 
     ); 
    } 
} 

私は、このクラスをテストしたい

[TestFixture] 
class LoadFinishedTrzlBatchTest 
{ 
    private LoadFinishedTrzlBatch _load; 

    [SetUp] 
    public void SetUpLoadFinishedTrzlBatch() 
    { 
     var proOrdRepository = 
      Mock.Create<IGenericRepository<ProductionOrder>>(); 
     var batchRepository = 
      Mock.Create<IGenericRepository<Batch>>(); 
     var codeRepository = 
      Mock.Create<IGenericRepository<Code>>(); 
     var aggRepository = 
      Mock.Create<IGenericRepository<Aggregation>>(); 
     var aggChildrenRepository = 
      Mock.Create<IGenericRepository<AggregationChildren>>(); 

     _load = new LoadFinishedTrzlBatch(
      proOrdRepository, 
      batchRepository, 
      codeRepository, 
      aggRepository, 
      aggChildrenRepository); 
    } 

    [Test] 
    public void ShouldExistsProductionOrder() 
    { 
     // Arrange 
     Mock.Arrange(() => _load.ExistsProductionOrder("ProOrd")) 
      .Returns(true) 
      .MustBeCalled(); 

     // Act 
     var actual = _load.ExistsProductionOrder("ProOrd"); 

     // Assert 
     Assert.AreEqual(actual, true); 
    } 
} 

そして最後に、これはIGenericRepositoryです:私はわからないんだけど、

public interface IGenericRepository<TEntity> 
{ 
    [ OMITTED ] 

    IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate); 

    [ OMITTED ] 
} 

ファーストこれがメソッドLoadFinishedTrzlBatch.ExistsProductionOrderをテストする正しい方法であれば。すべてがTDDで私にとって新しいもので、私は迷っています。

IGenericRepository<ProductionOrder>をどのように嘲笑したのか混乱しています。常に真であり、私はIGenericRepository<ProductionOrder>をテストしていません。たぶん私はリポジトリをテストしていないからかもしれない。

私は学んでいると私は何をやっているのかわかりません。これが私がこの質問をした理由です。私はExistsProductionOrderメソッドをテストしたい。

ExistsProductionOrderの方法をテストするにはどうすればよいですか?

+1

あなたが実際にここでテストしようとしていることは本当に明確ではありません。あなたが 'ExistsProductionOrder'メソッドをテストしているなら、なぜ最初にそれを擬似したいのですか? – DavidG

+0

私は学んでいると私は何をやっているのか分からないので。これが私がこの質問をした理由です。 'ExistsProductionOrder'メソッドをテストしたいと思います。 – VansFannel

+0

次に、それをそのままの形(つまり嘲笑されていない)で呼び出すだけで、依存関係をモックするだけです。特に、関係する依存関係のメソッドをモックしてください。 – DavidG

答えて

1

ターゲット依存関係を分離して、テストケース内で分離して配置できるようにする必要があります。あなたはまた、SUT(被験者)を模擬しません。あなたはその依存関係を模倣します。この場合、ジェネリックリポジトリをモックし、呼び出されているメソッドを手配します。つまり、SearchFor

とすると、そのメソッドが式述語を受け取ると仮定すると、モックに1を期待して、それを偽のコレクションストアに適用して実際のデータストアをモックすることができます。

[TestFixture] 
public class LoadFinishedTrzlBatchTest { 
    private LoadFinishedTrzlBatch sut; 
    //need this later so declaring as field. 
    private IGenericRepository<ProductionOrder> proOrdRepository; 

    [SetUp] 
    public void SetUpLoadFinishedTrzlBatch() { 
     //Not using these so they can be declared locally   
     var batchRepository = 
      Mock.Create<IGenericRepository<Batch>>(); 
     var codeRepository = 
      Mock.Create<IGenericRepository<Code>>(); 
     var aggRepository = 
      Mock.Create<IGenericRepository<Aggregation>>(); 
     var aggChildrenRepository = 
      Mock.Create<IGenericRepository<AggregationChildren>>(); 

     //initializing target mock 
     proOrdRepository = 
      Mock.Create<IGenericRepository<ProductionOrder>>(); 

     sut = new LoadFinishedTrzlBatch(
      proOrdRepository, 
      batchRepository, 
      codeRepository, 
      aggRepository, 
      aggChildrenRepository); 
    } 

    [Test] 
    public void ShouldExistsProductionOrder() 
    { 
     // Arrange 
     var productionOrderName = "ProOrd"; 
     var orders = new List<ProductionOrder>() { 
      new ProductionOrder { Name = productionOrderName }, 
      new ProductionOrder { Name = "Dummy for Filter" } 
     }; 
     Mock.Arrange(() => proOrdRepository 
      .SearchFor(Arg.IsAny<Expression<Func<ProductionOrder,bool>>>())) 
      .Returns((Expression<Func<ProductionOrder,bool>> expression) => 
       orders.Where(expression.Compile()).AsQueryable() 
      ) 
      .MustBeCalled(); 

     // Act 
     var actual = sut.ExistsProductionOrder(productionOrderName); 

     // Assert 
     Assert.IsTrue(actual); 
    } 
} 
+0

申し訳ありません、私は休暇を過ごしていましたが、私はあなたのソリューションをテストしましたが、proOrdRepositoryを作成すると、次のエラーメッセージが表示されます: 'InvalidOperationException:NUnit.Framework.TestFixtureSetUpAttribute、nunit.framework、NUnit.Framework.TestFixtureTearDownAttribute 、nunit.frameworkが見つかりませんでした。 – VansFannel

+0

私はこの質問をしました:https://stackoverflow.com/questions/45932110/typeinitializationexception-in-nunit-or-justmock – VansFannel

+0

@VansFannel初期化コードをsetup関数に移動します。 – Nkosi

1

は実際にあなたがしたいテストにあれば行うことになってit's何をExistsProductionOrder方法。したがって、あなたはモックそれをすべきではありません。しかし、と呼ばれるメンバーをこの方法でにモックしたいとします。たとえば、IGenericRepository<T>.DoSomething()を呼び出すことができます。

しかし、単にそれを呼び出すと、あなたは何を期待してその結果を比較する:あなたが何かにDoSomethingへの呼び出しを置き換えることができます

bool ExistsProductionOrder() { 
    this.proOrdRepository.DoSomething(); 
    return ... 
} 

:あなたの方法は次のようになりますとき今

[Test] 
public void ShouldExistsProductionOrder() 
{ 
    // Act 
    var actual = _load.ExistsProductionOrder("ProOrd"); 
    Assert.IsTrue(actual); 
} 

違う - あなたのモック。