0

この質問がここで何度も出されたことは知っていますが、コードの何が問題なのかまだわかりません。

シングルトンを実装するクラスがあります。このクラスは、Web サービス プロキシを使用してデータにアクセスします。データはキャッシュされ、その後の 2 回の呼び出しはサービスへの 1 回の呼び出しになります。それは実際に機能します。ステップスルーするとわかりますが、テストは失敗します。

[Test]
public void Test1()
{
    Mock<IAtomService> atomService = new Mock<IAtomService>();
    atomService.Setup(x => x.Get(It.IsAny<List<Identifier>>(), It.IsAny<AtomReturnFormat>()))
               .Returns<List<Identifier>, AtomReturnFormat>(
                   (list, format) => new AtomList { Atoms = new AtomCollection(list.Select(ident => new Atom { ID = Guid.Parse(ident.ID) })) });

    AtomCache.Instance.AtomService = atomService.Object;

    Guid id = Guid.NewGuid();
    List<string> ids = new List<string> { id.ToString() };

    AtomCache cache1 = AtomCache.Instance;
    cache1.Get(ids);

    AtomCache cache2 = AtomCache.Instance;
    cache2.Get(ids);

    AtomService.Verify(x => x.Get(It.IsAny<List<Identifier>>(), It.IsAny<AtomReturnFormat>()), Times.Once());
}

エラーは

Expected invocation on the mock once, but was 0 times: x => x.Get(It.IsAny<List`1>(), It.IsAny<AtomReturnFormat>())

Configured setups:
x => x.Get(It.IsAny<List`1>(), It.IsAny<AtomReturnFormat>()), Times.Never
No invocations performed.

どんな助けでも大歓迎です

アップデート

    public List<Atom> Get(List<string> atomIds)
    {
        if (atomIds == null)
            throw new ArgumentNullException("atomIds");

        Dictionary<string, Atom> cachedAtoms = Cache.Get(atomIds.Where(id => !string.IsNullOrEmpty(id)).Distinct().ToList());

        List<Atom> atoms = new List<Atom>();
        if (cachedAtoms != null)
        {
            List<string> missingAtomIds = atomIds.Except(cachedAtoms.Keys).ToList();
            atoms.AddRange(getMissingAtoms(missingAtomIds));

            atoms.AddRange(cachedAtoms.Where(kv => kv.Value != null).Select(kv => kv.Value));
        }
        return atoms;
    }

    private IEnumerable<Atom> getMissingAtoms(List<string> atomIds)
    {
        if (atomIds == null)
            throw new ArgumentNullException("atomIds");

        List<Atom> atoms = new List<Atom>();
        if (atomIds.Count > 0)
        {
            List<Atom> list = retrieveAtoms(atomIds);
            Cache.Add(list);
            atoms.AddRange(list);
        }

        return atoms;
    }

    private List<Atom> retrieveAtoms(List<string> atomIDs)
    {
        if (atomIDs == null)
            throw new ArgumentNullException("atomIDs");

        if (AtomService == null)
            throw new ApplicationException("AtomCache: Atom Service proxy is not initialized.");

        Guid temp;
        List<Identifier> idList = atomIDs.Where(id => !string.IsNullOrWhiteSpace(id) && Guid.TryParse(id, out temp))
                                         .Select(id => new Identifier {ID = id, Type = IdentifierTypeEnum.AtomPrimary})
                                         .ToList();

        List<Atom> atoms = atomIDs.Count == 0
                               ? new List<Atom>()
                               : ((AtomList) AtomService.Get(idList, AtomReturnFormat.Complete)).Atoms.ToList();

        return atoms;
    }
4

2 に答える 2

0

あなたの更新で何か変更を見逃していない限り、これが問題だと思います。

セットアップでは、識別子のリストが渡された場合に何を返すかをモックに伝えます。

atomService.Setup(x => x.Get(It.IsAny<List<Identifier>>(), %<--snip--

ただし、呼び出すときは、文字列のリストを渡しています。

List<string> ids = new List<string> { id.ToString() };

AtomCache cache1 = AtomCache.Instance;
cache1.Get(ids);

そして、この文字列のリストが識別子のリストに変換されることはどこにも見当たりません。そのため、モックはセットアップ条件を決して満たすことはありません。 .

于 2013-09-26T15:51:19.903 に答える