Unit testing MOSS part 2 (of 2)

Published 08 December 08 02:29 PM
In the 1. article on Unit testing MOSS I described some of the findings and experience on unit
testing SharePoint applications using the TypeMock Isolator framework. In this 2. article I will
provide some examples of unit tests.
 
Code under test
You should of course use TDD principles, but we are in a state where we have to add unit tests to already
existing code.
The code under test is a fairly simple method, already existing, which main purpose is to set the
MasterUrl-property on a site:

    public class CodeUnderTest
    {
        public void SetMasterUrlProperty(SPWeb web, string masterUrl)
        {
            try
            {
                if (masterUrl != null)
                {
                    if (!masterUrl.ToLower().EndsWith(".master"))
                    {
                        throw new ApplicationException("Invalid MasterUrl");
                    }
                    web.MasterUrl = masterUrl;
                    web.Update();
                }
            }
            catch (ApplicationException ex)
            {
                LogError("Unable to set master url property", ex);
            }
        }
    }
 
The tests
After creating a test project using right-click on the method, a test project, class and method 
is provided for modification. The tests will by default fail with a "test inconclusive" error
until it has been modified.

 
Success scenario
First we create the successful test where all is working as it should:
public void SetMasterUrlTest_Success()
{
    //Arrange
    CodeUnderTest codeUnderTest = new CodeUnderTest();
    web = Isolate.Fake.Instance<SPWeb>(Members.ReturnRecursiveFakes);
    string masterUrl = "test.master";
    Isolate.WhenCalled(() => web.MasterUrl).WillReturn("test.master");
    
    //Act
    codeUnderTest .SetMasterUrlProperty(web, masterUrl);
    
    //Assert
    Isolate.Verify.WasCalledWithAnyArguments(() => web.Update);
}
 
Here we are using the Arrange-Act-Assert pattern where we:
1.create an instance of the class under test
2.set up a fake SPWeb object
3.setting behavior on the .MasterUrl property
4.calling the method under test
5.verification that the Update method is called
 
Parameter testing
The next test we do is checking how the method under test is behaving if we provide a null-value as MasterUrl parameter.
       
        public void SetMasterUrlTest_MasterUrlIsNull()
        {
            //Arrange
            CodeUnderTest codeUnderTest  = new CodeUnderTest ();
            string masterUrl = null;
            Isolate.WhenCalled(() => web.MasterUrl).WillThrow(new System.Exception("MasterUrl should be set to NULL"));
            try
            {
                //Act
                codeUnderTest.SetMasterUrlProperty(web, masterUrl);
            }
            catch
            {
                 //Assert
                 Assert.Fail();
            }
        }

Here we are telling the method under test to throw an exception if MasterUrl is called with a null-value in the MasterUrl property. In other words, it should be allowed to provide a null-value as a parameter and the call should be done. We are expecting the test to fail if the property is called with the Assert.Fail in the catch-block.
       
Exception flow testing
The last test is a test to see how the method under test is behaiving when provided an invalid MasterUrl value:
       
        public void SetMasterUrlTest_InvalidUrl()
        {
            //Arrange
            CodeUnderTest codeUnderTest = new CodeUnderTest();
           
            string masterUrl = "ASDFASDF";
            Isolate.WhenCalled(() => web.MasterUrl).WillThrow(new System.Exception("Invalid MasterUrl"));
            try
            {
                //Act
                codeUnderTest.SetMasterUrlProperty(web, masterUrl);
                //Assert
                Assert.Fail();
            }
            catch
            {
            }
        }

Here we are expecting the method under test to throw an exception if an invalid MasterUrl-value is provided.
 
 
Happy testing!

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# infoblog &raquo; Unit testing MOSS part 2 (of 2) said on December 8, 2008 10:31 AM:

PingBack from http://blog.a-foton.ru/index.php/2008/12/08/unit-testing-moss-part-2-of-2/

# infoblog &raquo; Unit testing MOSS part 2 (of 2) said on December 8, 2008 10:31 AM:

PingBack from http://blog.a-foton.ru/index.php/2008/12/08/unit-testing-moss-part-2-of-2/

# Confluence: SharePoint Development Wiki said on December 12, 2008 9:23 AM:

\\ Testdriven development (TDD) is a Computer programming technique that involves writing tests first and then implementing the code to make them pass....

# SharePoint Daily said on December 12, 2008 9:25 AM:

Top News Stories Microsoft and HP Extend Private-Label Hosting Opportunities to Value-Added Resellers

# SharePoint Daily said on December 15, 2008 9:35 AM:

Top News Stories A New Approach To Collaboration and Enterprise Content Management (Informationweek)

# SharePoint Daily said on December 16, 2008 9:59 AM:

Top News Stories Microsoft Releases Toolkit for Reusing SharePoint Portlets (PC World) Microsoft has

# SharePoint Daily said on December 17, 2008 9:21 AM:

Top News Stories New White Paper for CFOs Offers Advice for Improving Finance Operations in 2009 with

# SharePoint Daily said on December 18, 2008 9:34 AM:

Top News Stories Fujitsu First to Integrate Microsoft Office SharePoint Server 2007 Software Across Entire

Leave a Comment

(required) 
(optional)
(required) 

  
Enter Code Here: Required

This Blog

Syndication

Page view tracker