【问题标题】:typemock test not workingtypemock 测试不工作
【发布时间】:2015-12-03 05:14:08
【问题描述】:
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 很陌生,并且写过类似的东西。我知道我需要模拟参数和上下文,但是由于该方法没有返回任何内容,我该如何测试它。 仅当 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);


      }

【问题讨论】:

    标签: typemock typemock-isolator


    【解决方案1】:

    免责声明,我在 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。如果它是伪造的,它将不会真正被调用,也不会被测试。
    • 不要在执行您要测试的代码之前编写断言\验证,在这种情况下,在验证之前不会调用 context.Process(fake)。

    【讨论】:

    • 感谢 typemock 团队的支持。上面的步骤给了我一个开始。我根据代码要求进行了一些更改,并且效果很好。再次感谢您
    猜你喜欢
    • 2015-09-09
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多