2017-09-27 18 views
1

私のテストケースで問題がある、私はICacheProviderの返信を模倣しようとしているが、常にnullを返す。NS代理店ReturnsForAnyArgsはnullを返すが、そうでなければならない。

[Fact] 
public void Raise_ShoultReturnTrue_IfItsInCache() 
{ 
    var cacheProvider = Substitute.For<ICacheProvider>(); 
    cacheProvider.Fetch(Arg.Any<string>(), default(Func<IEnumerable<int>>)).ReturnsForAnyArgs(GetFakeCacheDB()); 

    //I was expecting the var below to contain the data from GetFakeCacheDB method 
    var cacheProviderReturn = cacheProvider.Fetch("anything", returnEmpty); 

    //there is more stuff here but doesnt matter for the question  
} 

private HashSet<int> returnEmpty() 
{ 
    return new HashSet<int>(); 
} 

private IEnumerable<int> GetFakeCacheDB() 
{ 
    var cacheData = new List<int>() 
        { 
         57352, 
         38752 
        };  
    return cacheData; 
} 

public interface ICacheProvider 
{ 
    void Add<T>(string key, T item); 
    void Add<T>(string key, T item, DateTime? absoluteExpiry, TimeSpan? relativeExpiry); 
    T Fetch<T>(string key, Func<T> dataLookup); 
    T Fetch<T>(string key, Func<T> dataLookup, DateTime? absoluteExpiry, TimeSpan? relativeExpiry); 
    void Remove<T>(string key); 
} 

私のテストケースで何が間違っていますか?

答えて

1

モックされたメソッドの引数の設定は、渡されたものと一致しないため、nullが返されます。

あなたは現在、nullのデフォルト値であるdefault(Func<IEnumerable<int>>)を期待していますが、モックの運動では、設定された期待値と一致しない実際の関数を渡します。

第2引数としてもArg.Anyを使用すると、運動時に模擬期待をより柔軟にすることができます。

cacheProvider 
    .Fetch(Arg.Any<string>(), Arg.Any<Func<IEnumerable<int>>>()) 
    .ReturnsForAnyArgs(GetFakeCacheDB()); 
+0

あなたの答えのおかげで、私はメソッドのシグネチャを変更すると、それは "HashSetの returnEmpty()" を "IEnumerableを returnEmptyを()" 働いていました – TiagoM

1

スタブコールが実際に実行されているコールと異なるため、テストが失敗する理由があります。これは、一般的な引数の参照することは困難ですが、あなたがそれらを明示的に指定する場合は、このような何かを得るでしょう:最初の行がされてきたがので、二つの異なる方法として

// Arrange 
cacheProvider.Fetch<IEnumerable<int>>(/* ... */).ReturnsForAnyArgs(GetFakeCacheDB()); 
// Act 
var cacheProviderReturn = cacheProvider.Fetch<HashSet<int>>("anything", returnEmpty); 

.NETは見Fetch<IEnumerable<int>>()Fetch<HashSet<int>>をすべての引数に対してGetFakeCacheDB()を返すようにスタブされている場合、2番目のメソッドは設定されておらず、nullを返します。詳細は、this postを参照してください。

テストを期待通りに機能させるには、ジェネリックコールシグネチャが一致していることを確認してください。ジェネリックを明示的に指定するか、渡された引数が正しいジェネリックになるようにしてください。

// Option 1: explicit generic 
var cacheProviderReturn = cacheProvider.Fetch<IEnumerable<int>>("anything", returnEmpty); 
// where `returnEmpty` is `Func<HashSet<int>>` 

// Option 2: keep stubbed call the same, and change `returnEmpty` return type 
// from `HashSet<int>` to `IEnumerable<int>` to make sure it results 
// in correct generic being called. 
private IEnumerable<int> returnEmpty() { 
    return new HashSet<int>(); 
} 
関連する問題