在EPiServer中,有人会如何测试类似的扩展程序:
public static class LinkItemExtensions
{
public static T GetTypedPage(this LinkItem link) where T : TypedPageData
{
return (T) DataFactory.Instance.GetPage(PageReference.ParseUrl(link.Href));
}
}
我要做的是以某种方式使用以下代码测试上面的类:
[TestFixture]
public class LinkItemExtensionsTests
{
[Test]
public void GetTypedPage_GivenALinkItem_ReturnsTypedPageData()
{
var link = new LinkItem();
var typedPage = link.GetTypedPage();
Assert.IsAssignableFrom(typeof(StartPageData), typedPage);
}
}
召唤DataFactory.Instance时会出现问题。
System.TypeInitializationException : The type initializer for 'EPiServer.DataFactory' threw an exception. ----> System.NullReferenceException : Object reference not set to an instance of an object.
所以我尝试将DataFactory的抽象传递给扩展方法,如下所示:
namespace WebTests
{
[TestFixture]
public class PageDataExtensionsTests
{
[Test]
public void GetTypedPage_GivenALinkItem_ReturnsTypedPageData()
{
var link = new LinkItem();
var startPage = A.Fake<StartPageData>();
var pageDataFactory = A.Fake<IDataFactoryFacade>();
A.CallTo(() => pageDataFactory.GetPage(null))
.WithAnyArguments()
.Returns(startPage);
var typedPage = link.GetTypedPage<StartPageData>(pageDataFactory);
Assert.IsAssignableFrom(typeof(StartPageData), typedPage);
}
}
}
我得到了
var startPage = A.Fake<StartPageData>();
var pageDataFactory = A.Fake<IDataFactoryFacade>();
A.CallTo(() => pageDataFactory.GetPage(null))
.WithAnyArguments()
.Returns(startPage);
var typedPage = link.GetTypedPage<StartPageData>(pageDataFactory);
Assert.IsAssignableFrom(typeof(StartPageData), typedPage);
}
}
你如何处理这个问题?
答案 0 :(得分:0)
你应该依赖于抽象而不是它的实现(你应该在DataFactory之上有一些外观)。请查看More testability to the people with EPiAbstractions!。