3. Your Guide: Chris Weldon
• Fightin’ Texas Aggie
• .Net and PHP Developer
• UNIX and Windows Sysadmin
• Sr. Consultant at Improving Enterprises
• chris@chrisweldon.net
5. Assumptions
• You develop software
• You unit test
• You know the SharePoint API (or can follow along)
6. Standard Testing Practices
A Common Problem
namespace SharePointLogic
{
public class ClassWithDependencies
{
private IDataRepository repository;
public ClassWithDependencies(IDataRepository repo)
{
this.repository = repo;
}
public INode GetNodeByName(string name)
{
return this.repository.Where(x => x.Name.Equals(name))
.Select();
}
}
}
7. public IList<SPUser> GetUsersInSiteCollection(string siteUrl) {
using (SPSite site = new SPSite(siteUrl) {
site.CatchAccessDeinedError = false;
using (SPWeb web = site.RootWeb) {
try {
if (web.DoesUserHavePermissions(SPBasePermissions.ManageWeb)) {
SPUsercollection users = web.Users;
List<SPUser> usersWithAccess = new List<SPUser>();
foreach (SPUser user in users) {
if (web.DoesUserHavePermissions(
user.LoginName, SPBasePermissions.ManageWeb)) {
usersWithAccess.Add(user);
}
}
return usersWithAccess;
}
} catch (UnauthorizedAccessException e) {
return new List<SPUser>();
}
}
}
}
8. Standard Testing Practices
A Common Problem
• What if no database locally?
• Did you write test logic to rebuild the database
before each test run?
• What if this dependency is a physical piece of
hardware?
9. Standard Testing Practices
How to Solve
namespace SharePointLogicTests
{
[TestClass]
public class ClassWithDependenciesTests
{
[TestMethod]
public void TestGetNodesByName()
{
// Arrange.
INode node = new SharePointNode();
IDataRepository repository =
(IDataRepository)MockRepository.Stub<IDataRepository>();
repository.Stub(x => x.Where).Returns(repository);
repository.Stub(x => x.Select).Returns(node);
repository.Replay();
// ...
10. Standard Testing Practices
How to Solve
// Act.
ClassWithDependencies testClass = new ClassWithDependencies(repository);
INode testNode = testClass.GetNodeByName("Test");
// Assert.
Assert.AreEqual(node, testNode);
}
}
}
11. Standard Testing Practices
What about SharePoint?
• Most of SharePoint object model has NO interfaces
• Worse, most also are Sealed classes, meaning no
extending and overriding the SharePoint behavior
• Most SharePoint objects require active connection
and instance of SharePoint on local server
• Unlike database projects, resetting and recreating
state in SharePoint is way more difficult
12. Standard Testing Practices
A SharePoint Common Problem
public string GetNameOfSharePointWebSite(string url)
{
using (SPSite site = new SPSite(url))
{
using (SPWeb web = site.OpenWeb())
{
return web.Name;
}
}
}
13. Pex and Moles
• What is it?
• Pex discovers boundary conditions of your tests
and automates test creation
• Visual Studio Add In
• Developed by Microsoft Research
• Available for Academic or for MSDN subscribers
14. Pex and Moles
• Moles is, simply put, a mocking and stubbing
framework
• Different than other traditional mocking
frameworks
• Uses detours to custom delegates via runtime
instrumentation
15. Pex and Moles
• Pex and Moles are not mutually exclusive
• Neither are dependent upon one another
17. Pex and Moles
• As your dependency on SharePoint Object Model
grows, more detours required for testing
• In most cases, more tedious than beneficial
• If only could have most of the basic SharePoint
behaviors pre-generated
• Solution:
Microsoft.SharePoint.Behaviors
22. Observations
• Even behaviors are not complete
• A lot of mocking activity may get repeated
• Unit test setup logic gets refactored into common
assemblies
23. Observations
• Even behaviors are not complete
• A lot of mocking activity may get repeated
• Unit test setup logic gets refactored into common
assemblies
• Save time: create scenarios
24. Observations
• Even behaviors are not complete
• A lot of mocking activity may get repeated
• Unit test setup logic gets refactored into common
assemblies
• Save time: create scenarios
• Use BDD-style approach for testing
27. Gotchas
• More moles unit tests = much longer test execution
time
• Continuous Integration
28. Gotchas
• More moles unit tests = much longer test execution
time
• Continuous Integration
• This will take time to learn, research, and debug
29. Gotchas
• More moles unit tests = much longer test execution
time
• Continuous Integration
• This will take time to learn, research, and debug
• Pay attention when it stops adding value
30. Gotchas
• More moles unit tests = much longer test execution
time
• Continuous Integration
• This will take time to learn, research, and debug
• Pay attention when it stops adding value
• The GAC
31. Gotchas
• More moles unit tests = much longer test execution
time
• Continuous Integration
• This will take time to learn, research, and debug
• Pay attention when it stops adding value
• The GAC
34. Recommendations
• If you can do it, build a facade in front of SharePoint
• Make sure you are producing consistent behaviors
35. Recommendations
• If you can do it, build a facade in front of SharePoint
• Make sure you are producing consistent behaviors
• If you don’t know what SharePoint does,
disassemble it