2013-01-24 12 views
6

で可算のリストを確認:私はこのようになります方法のためのユニットテストを書くことをしようとしている部品番号

public int Save(IEnumerable<int> addedIds, IEnumerable<int> removedIds) 
{ 
    var existingIds = repository.Get(); 
    IEnumerable<int> ids = existingIds.Except(removedIds).Union(addedIds)); 
    return repository.Create(ids); 
} 

部品番号でのテストは次のようになります。

repository.Setup(r => r.Get()).Returns(CreateList()); 
service.Save(addedIds, removedIds); 
repository.Verify(r => r.Create(It.Is<IEnumerable<int>>(l => VerifyList(l)))); 

これが失敗しましたこのエラーで、そしてVerifyList()が呼び出されることはありません:モックの呼び出しに少なくとも一度期待

、しかし、行っ決して た:

r => r.Create(It.Is<IEnumerable'1>(list => VerifyList(list)))

出演呼び出し:呼び出されたタイプとして

IRepo.Create(System.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32])

IEnumerable<int>ではなく、実際System.Linq.Enumerable+<UnionIterator>d__88'1[System.Int32])であり、テストは失敗しません。 (すべてが正しく起こっているとの結果がとして期待されている、テストのステップ実行)

私はテスト対象のメソッドでids.ToList()を呼び出す場合、これらの結果は以下のとおりです。少なくとも一度はモックの呼び出しを期待

しかし、行われていませんでした:

r => r.Create(It.Is<List'1>(l => VerifyList(l)))

出演呼び出し: IRepo.Create(System.Collections.Generic.List'1[System.Int32])

これには何らかの方法がありますか?または私は何か間違っているのですか?

編集:私はVerifyListメソッドで間違いがあったので、falseを返していましたが、Moqはその情報を与えていませんでした。タイプの違いは...迅速かつ汚い

答えて

8

これは動作するようです。しかし、いくつかの前提を作った。 VerifyListメソッドが良いかもしれないと思います。 =)

[Test] 
    public void Test() 
    { 
     // SETUP 
     Mock<IRepository> repository = new Mock<IRepository>(); 
     Service service = new Service(repository.Object); 
     repository.Setup(r => r.Get()).Returns(CreateList()); 

     IEnumerable<int> addedIds = new[]{1,2}; 
     IEnumerable<int> removedIds = new[]{3,4}; 
     service.Save(addedIds, removedIds); 

     repository.Verify(r => r.Create(It.Is<IEnumerable<int>>(l => VerifyList(l)))); 
    } 

    private static bool VerifyList(IEnumerable<int> enumerable) 
    { 
     return enumerable.Contains(1) && enumerable.Contains(2) && enumerable.Contains(5); 
    } 

    private IEnumerable<int> CreateList() 
    { 
     return new[] { 3, 4, 5 }; 
    } 

    public interface IRepository 
    { 
     IEnumerable<int> Get(); 
     int Create(IEnumerable<int> id); 
    } 
    public class Service 
    { 
     public Service(IRepository repository) 
     { 
      this.repository = repository; 
     } 

     private IRepository repository; 

     public int Save(IEnumerable<int> addedIds, IEnumerable<int> removedIds) 
    { 
     var existingIds = repository.Get(); 
      IEnumerable<int> ids = existingIds.Except(removedIds).Union(addedIds); 

     return repository.Create(ids); 
    } 
+0

このテストでは、私のバージョンのMoqが使用できます。私はまだ鉱山が失敗する理由を理解していません。 – stuartd

+0

それは奇妙です。あなたはMoqを更新できますか?どのバージョンのMoqを使用していますか? – Markus

+0

VerifyListメソッドでエラーが発生しましたが、結局呼び出されていました。あなたの助けをありがとう。 – stuartd

2

何か赤いニシンです -

public interface IBlah 
{ 
    void Sum(IEnumerable<int> baz); 
} 

class Blah : IBlah 
{ 
    public void Sum(IEnumerable<int> baz) 
    { 
     return; 
    } 
} 

public class Baz 
{ 
    private readonly IBlah blah; 

    public Baz(IBlah blah) 
    { 
     this.blah = blah; 
    } 

    public void Sum(IEnumerable<int> baz) 
    { 
     blah.Sum(baz); 
    } 
} 

そして、それが好きなテスト -

[Test] 
public void foo() 
{ 
    var mock = new Mock<IBlah>(); 
    var enumerable = Enumerable.Range(1, 10); 

    var baz = new Baz(mock.Object); 
    baz.Sum(enumerable.Where(x => x%2 == 0)); 

    mock.Verify(p => p.Sum(It.Is<IEnumerable<int>>(z => z.All(x => x%2==0)))); 
} 
関連する問題