typemock测试无法正常工作

时间:2015-12-03 05:14:09

标签: typemock typemock-isolator

public class GetDatasourceDependencies : BaseProcessor
    {
        /// <summary>
        /// The process.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        public override void Process(GetDependenciesArgs context)
        {
            Assert.IsNotNull(context.IndexedItem, "indexed item");
            Assert.IsNotNull(context.Dependencies, "dependencies");

            Item item = (context.IndexedItem as SitecoreIndexableItem);

            if (item != null)
            {
                var layoutLinks = Globals.LinkDatabase.GetReferrers(item, FieldIDs.LayoutField);

                var sourceUris = layoutLinks.Select(l => l.GetSourceItem().Uri).Where(uri => uri != null && uri != item.Uri).Distinct();   
                context.Dependencies.AddRange(sourceUris.Select(x => (SitecoreItemUniqueId)x));

            }
        }
    }

如何使用typock为此编写测试。我对typemock很新,​​并写了这样的东西。我知道我需要模拟args和context但是因为该方法没有返回任何内容,我该如何测试它。 只有context.dependents有一些值时,我的测试应该是成功的。

 [Test]
      public void GetIndexingDependencies_Calls()
      {
        var indexable = Isolate.Fake.Instance<IIndexable>();
        var fake = Isolate.Fake.Instance<GetDependenciesArgs>();            
        var context = Isolate.Fake.Instance<GetDatasourceDependencies>();          
        var obj = new GetDatasourceDependencies();
        Isolate.Verify.WasCalledWithAnyArguments(() => context.Process(fake));
        Isolate.WhenCalled(() => fake.IndexedItem).WillReturn(indexable);




        //Isolate.WhenCalled(() => fake.Dependencies.Count).WillReturn(2);


      }

1 个答案:

答案 0 :(得分:0)

免责声明,我在Typemock工作。

您可以将一个真实的集合用于context.Dependencies并声明实际添加了一些项目。

要实现这一点,您应该替换Globals返回的集合,并确保linq可以按预期处理它(为了示例,我只是从linq查询返回了相同的集合)。

您的测试应该如下所示:

    public void GetIndexingDependencies_Calls()
    {
        //Arrange
        var fakeContext = Isolate.Fake.Instance<GetDependenciesArgs>();
        fakeContext.Dependencies = new List<SitecoreItemUniqueId>();

        var itemList = new List<SomeItem> { new SomeItem(), new SomeItem() };
        Isolate.WhenCalled(() => Globals.LinkDatabase.GetReferrers(null, null)).WillReturn(itemList);
        Isolate.WhenCalled(() => itemList.Select(l => l.GetSourceItem().Uri).Where(uri => true).Distinct()).WillReturn(itemList);

        //ACT
        var underTest = new GetDatasourceDependencies();
        underTest.Process(fakeContext);

        //ASSERT
        Assert.AreEqual(2, fakeContext.Dependencies.Count);
    }

更多要点:

  • 不要伪造你正在测试的东西,在这种情况下它是GetDatasourceDependencies。如果它是伪造的,它将不会真正被调用而不被测试。
  • 在执行您尝试测试的代码之前不要写asserts \ verify,在这种情况下context.Process(假)在验证之前没有被调用。