typemock тест не работает

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.depends есть некоторые значения.

 [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);


      }

person Lee    schedule 03.12.2015    source источник


Ответы (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. Если это подделка, то она действительно не будет называться и не будет проверяться.
  • Не пишите asserts\verify перед выполнением кода, который вы пытаетесь протестировать, в этом случае context.Process(fake) не вызывался перед проверкой.
person Al.exe    schedule 03.12.2015
comment
Спасибо за поддержку команде typemock. Вышеуказанные шаги дали мне начало. Я сделал несколько изменений в соответствии с требованиями кода, и это сработало. Еще раз спасибо - person Lee; 07.12.2015