Sample 1: Faking items retrieval from a SharePoint site
Original Method
The following sample includes a function that retrieves all of the items from a list called Tasks. The list has the Urgent priority.
C# public List<string> GetUrgentTasks() { var site = new SPSite("http://sharepoint.typemock.com"); var taskList = site.OpenWeb().Lists[TASKS_LIST_NAME]; var urgentTasks = new List<string>(); foreach (SPListItem item in taskList.Items) { if (item[PriorityFieldName] != null && item[PriorityFieldName].ToString() == Priority.Urgent.ToString()) { urgentTasks.Add(item.Name); } } return urgentTasks; }
VB
Public Shared Function GetUrgentTasks() As List(Of String)
Dim site = New SPSite("http://sharepoint.typemock.com")
Dim taskList = site.OpenWeb().Lists(TASKS_LIST_NAME)
Dim urgentTasks = New List(Of String)()
For Each item As SPListItem In taskList.Items
If item(PriorityFieldName) IsNot Nothing AndAlso item(PriorityFieldName).ToString() = Priority.ePriority.Urgent.ToString() Then
urgentTasks.Add(item.Name)
End If
Next
Return urgentTasks
End Function
Typemock Isolator Features Used
• Recursive Fakes
• Swap Future Instance
• Implicit Collection Creation
Scenario
1. Fake the SPSite class. Because you need all of the object-model classes instantiated from SPSite to be faked as well, use the Recursive Fakes feature.
2. Because SPSite is instantiated inside the test code, use Swap.NextInstance to define that the next instance of SPSite will be replaced with the faked one.
3. Populate the fake SPList object with items. Using the implicit collection creation, you can define a collection of 10 items and populate them with only two items.
4. Call GetUrgentTasks() and check the result using Assertions.
Code
C# [TestMethod, Isolated] public void GetUrgentTasks_QuerySiteForAllTasksAndReturnTheNamesOfTheUrgentTasks_TwoUrgentTasksFound() { // Fake recursively the next SPSite and all its returned classes are faked var fakeSite = Isolate.Fake.NextInstance<SPSite>(); // Retrieve a fake SPList to set behavior var fakeTaskList = fakeSite.OpenWeb().Lists[SharePointLogic.TASKS_LIST_NAME]; // Isolator will automatically create an internal fake list with 10 items in it (based on the highest indexer) // Two of those items (1 and 9) have "Urgent" Priority ,while the rest are not important for the test string urgentPriorityString = SharePointLogic.Priority.Urgent.ToString(); var priorityFieldName = SharePointLogic.PriorityFieldName; Isolate.WhenCalled(() => fakeTaskList.Items[1][priorityFieldName]).WillReturn(urgentPriorityString); Isolate.WhenCalled(() => fakeTaskList.Items[9][priorityFieldName]).WillReturn(urgentPriorityString); Isolate.WhenCalled(() => fakeTaskList.Items[1].Name).WillReturn("Do the laundry"); Isolate.WhenCalled(() => fakeTaskList.Items[9].Name).WillReturn("Wash the dishes"); // Call The Method under test var urgentTasks = classUnderTest.GetUrgentTasks(); Assert.AreEqual(2, urgentTasks.Count); Assert.AreEqual("Do the laundry", urgentTasks[0]); Assert.AreEqual("Wash the dishes", urgentTasks[1]); }
VB
<TestMethod(), Isolated()>
Public Sub GetUrgentTasks_QuerySiteForAllTasksAndReturnTheNamesOfTheUrgentTasks_TwoUrgentTasksFound()
' Fake recursively the next SPSite and all its returned classes are faked
Dim fakeSite = Isolate.Fake.NextInstance(Of SPSite)()
' Retrieve a fake SPList to set behavior
Dim fakeTaskList = fakeSite.OpenWeb().Lists(SharePointLogic.TASKS_LIST_NAME)
' Isolator will automatically create an internal fake list with 10 items in it (based on the highest indexer)
' Two of those items (1 and 9) have "Urgent" Priority ,while the rest are not important for the test
Dim urgentPriorityString As String = SharePointLogic.Priority.ePriority.Urgent.ToString()
Dim priorityFieldName = SharePointLogic.PriorityFieldName
Isolate.WhenCalled(Function() fakeTaskList.Items(1)(priorityFieldName)).WillReturn(urgentPriorityString)
Isolate.WhenCalled(Function() fakeTaskList.Items(9)(priorityFieldName)).WillReturn(urgentPriorityString)
Isolate.WhenCalled(Function() fakeTaskList.Items(1).Name).WillReturn("Do the laundry")
Isolate.WhenCalled(Function() fakeTaskList.Items(9).Name).WillReturn("Wash the dishes")
' Call The Method under test
Dim urgentTasks = SharePointLogic.GetUrgentTasks()
Assert.AreEqual(2, urgentTasks.Count)
Assert.AreEqual("Do the laundry", urgentTasks(0))
Assert.AreEqual("Wash the dishes", urgentTasks(1))
End Sub