Testing EPiServer sure takes a lot of mocking… | Johan Driessen

Testing EPiServer sure takes a lot of mocking…

A quick follow up to my last post. Even with EPiAbstractions, testing takes a lot of mocking and setup code…

Testing this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void CreateOrtkoppling( int verksamhetsId )
{
var ortContainer = GetOrtContainer() ?? CreateOrtContainer();

CreateVerksamhetPage( ortContainer, verksamhetsId );
}

public PageData GetOrtContainer()
{
return (from p in _dataFactory.GetChildren( _page.PageLink )
where p.PageName == OrtContainerPageName
select p).SingleOrDefault();
}

private void CreateVerksamhetPage( PageData ortContainer, int verksamhetsId )
{
var verksamhet = _verksamhetRepository.Get( verksamhetsId );
if (verksamhet == null)
throw new ArgumentException( "Det finns ingen verksamhet med id " + verksamhetsId );

var page = _dataFactory.GetDefaultPageData( ortContainer.PageLink, OrtPageTypeId );
page.PageName = string.Format( "{0}, {1}", verksamhet.Ort, verksamhet.Besöksadress );
page.Property[VerksamhetsIdProperty].Value = verksamhetsId;
_dataFactory.Save( page, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.NoAccess );
}

took me this much code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
private Mock<IDataFactoryFacade> dataFactoryMock;
private Mock<IVerksamhetRepository> verksamhetRepositoryMock;
private Mock<PagePropertyUtils> pagePropertyUtilsMock;
private Mock<IPageReferenceFacade> pageReferenceMock;
private PageData utbildningsPage;
private UtbildningPageHandler utbildning;

[SetUp]
public void Setup()
{
int utbildningsPageId = 4711;
utbildningsPage = CreatePageDataObject( "Testutbildning", utbildningsPageId );
verksamhetRepositoryMock = new Mock<IVerksamhetRepository>();
pagePropertyUtilsMock = new Mock<PagePropertyUtils>();
pageReferenceMock = new Mock<IPageReferenceFacade>();
dataFactoryMock = new Mock<IDataFactoryFacade>();
dataFactoryMock.Setup( d => d.GetPage( It.Is<PageReference>( p => p.ID == utbildningsPageId ) ) )
.Returns( utbildningsPage );
utbildning = new UtbildningPageHandler( dataFactoryMock.Object, verksamhetRepositoryMock.Object, pagePropertyUtilsMock.Object,
pageReferenceMock.Object, utbildningsPageId );
}

private int MockOrtContainerPage()
{
var pageName = GetPrivateField<string>( utbildning, "OrtContainerPageName" );
int containerPageId = 17;

var containerPage = CreatePageDataObject( pageName, containerPageId );

dataFactoryMock.Setup( d => d.GetChildren( It.Is<PageReference>( p => p.ID == utbildningsPage.PageLink.ID ) ) ).Returns(
new PageDataCollection( new List<PageData> {
containerPage
} )
);
return containerPageId;
}

protected static PageData CreateDefaultPageDataObject()
{
var page = new PageData();
page.Property.Add( "PageName", new PropertyString() );
var propertyPageReference = new PropertyPageReference( PageReference.EmptyReference );
SetPrivateField<Guid>( propertyPageReference, "_pageGuid", Guid.NewGuid() );
page.Property.Add( "PageLink", propertyPageReference );
page.ACL = new EPiServer.Security.AccessControlList();
return page;
}

protected static T GetPrivateField<T>( object o, string fieldName )
{
Type type = o.GetType();
BindingFlags privateBindings = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
FieldInfo match = type.GetField( fieldName, privateBindings );
if (match != null)
{
return (T)match.GetValue( o );
}
return default(T);
}

[Test]
public void CreateOrtkoppling_Will_Create_Page_And_Save_VerksamhetsId_As_Property()
{
var containerPageId = MockOrtContainerPage();
var verksamhet = new Verksamhet { Id = 17, Besöksadress = "Gatan 1", Ort = "Staden", Postadress = "123 45" };
verksamhetRepositoryMock.Setup( v => v.Get( verksamhet.Id ) ).Returns( verksamhet );
var defaultPageData = CreateDefaultPageDataObject();
var propertyName = GetPrivateField<string>( utbildning, "VerksamhetsIdProperty" );
defaultPageData.Property.Add( propertyName, new PropertyNumber() );
var ortPageTypeId = 19;
pagePropertyUtilsMock.Setup( p => p.GetPropertyValue<int>( It.IsAny<PageReference>(), "UtbildningsOrtPageType" ) ).Returns( ortPageTypeId );
dataFactoryMock.Setup( d => d.GetDefaultPageData( It.Is<PageReference>( p => p.ID == containerPageId ), ortPageTypeId ) )
.Returns( defaultPageData );
dataFactoryMock.Setup(d => d.Save(defaultPageData, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.NoAccess))
.Callback<PageData, EPiServer.DataAccess.SaveAction, EPiServer.Security.AccessLevel>( ( pageToSave, saveAction, accessLevel ) =>
{
var id = (int)pageToSave.Property[propertyName].Value;
Assert.That( id, Is.EqualTo( verksamhet.Id ) );
Assert.That( pageToSave.PageName, Is.EqualTo( string.Format( "{0}, {1}", verksamhet.Ort, verksamhet.Besöksadress ) ) );
} );

utbildning.CreateOrtkoppling( verksamhet.Id );

dataFactoryMock.VerifyAll();
verksamhetRepositoryMock.VerifyAll();
}

Now, most of that code (everything except for the actual test) is reused in other tests, but still! It’s a bit exhausting!