typemock 测试不起作用
typemock test not working
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.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 工作。
您可以为 context.Dependencies 使用真实的集合,并断言某些项目确实已添加。
要实现这一点,您应该替换 Globals returns 的集合,并确保 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) 在验证之前不会被调用。
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.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 工作。
您可以为 context.Dependencies 使用真实的集合,并断言某些项目确实已添加。
要实现这一点,您应该替换 Globals returns 的集合,并确保 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) 在验证之前不会被调用。