Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

Adventures in Testing - 6 - Using Moq, the “It” class

This article is cross-posted from my personal blog.

In a previous article in this series of blog posts, I introduced Moq (Mock-you) – the mocking framework we are using in DotNetNuke to generate Mock objects for testing.

In this article I will start to dive deeper into this framework by looking at the unusually named “It” class.

What is “It”?

“It” is a static helper class that provides 4 static methods that allows testers to match a method invocation with an arbitrary value, with a value in a specified range, or even one that matches a given predicate.

The four methods it provides are:

  1. Is(Expression >)
  2. IsAny
  3. IsInRange(TValue from, TValue to, Range rangeKind)
  4. IsRegex(string regex) (+ overloads)

    The name of the class, while it appears strange, allows us to write readable tests.

    For example, continuing our use of the VocabularyController class, lets look at a test for the AddVocabulary method.  Listing 1 shows the AddVocabulary method.

    Listing 1: The AddVocabulary method of VocabularyController

       1:  Public Function AddVocabulary(ByVal vocabulary As Vocabulary) As Integer _
       2:                          Implements IVocabularyController.AddVocabulary
       3:      'Argument Contract
       4:      Requires.NotNull("vocabulary", vocabulary)
       5:      Requires.PropertyNotNullOrEmpty("vocabulary", "Name", vocabulary.Name)
       6:      Requires.PropertyNotNegative("vocabulary", "ScopeTypeId", vocabulary.ScopeTypeId)
       8:      vocabulary.VocabularyId = _DataService.AddVocabulary(vocabulary, _
       9:                                      UserController.GetCurrentUserInfo.UserID)
      11:      'Refresh Cache
      12:      DataCache.RemoveCache(_CacheKey)
      14:      Return vocabulary.VocabularyId
      15:  End Function

    As in the previous article, one of the tests we need to write is a test that confirms that the VocabularyId property of the vocabulary is set to the value returned from the call to the DataService (line 8).

    Listing 2: Testing that the VocabularyController’s AddVocabulary method sets the VocabularyId correctly.

       1:  [Test]
       2:  public void VocabularyController_AddVocabulary_Sets_ValidId_On_Valid_Vocabulary()
       3:  {
       4:      //Arrange
       5:      Mock mockDataService = new Mock();
       6:      mockDataService.Setup(ds => ds.AddVocabulary(It.IsAny(), It.IsAny<int>()))
       7:                    .Returns(Constants.VOCABULARY_AddVocabularyId);
       9:      VocabularyController vocabularyController = new VocabularyController(mockDataService.Object);
      11:      Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary();
      13:      //Act
      14:      vocabularyController.AddVocabulary(vocabulary);
      16:      //Assert
      17:      Assert.AreEqual<int>(Constants.VOCABULARY_AddVocabularyId, vocabulary.VocabularyId);
      18:  }

    In this example we make use of the “It” class in the Setup method of the Mock.  This code is pretty self-explanatory.  In the set up, as long as the mock DataService’s AddVocabulary method is given any Vocabulary instance (It.IsAny()) and any integer (It.IsAny()) it should return a known VocabularyId (Constants.VOCABULARY.AddVocabularyId).

    The beauty of this class is it is clear what the methods are being used for.

    It.IsAny() – means accept any instance of IFoo

    It.Is(i => i%2 == 0) – means accept any even number (or any integer which is divisible by 2)

    For example:

    // given any value return true
    mock.Setup(foo => foo.Execute(It.IsAny<string>())).Returns(true);
    // given any even number return true
    mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 
    // If the value is between 1 and 10 return true
    mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 
    // If the string matches the Regex [a-d]+, return "foo"
    mock.Setup(x => x.Execute(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");

    We can also use it in the Assert phase to verify that a method was called with a particular value..

    // assert Execute was called - with any string
    mock.Verify(foo => foo.Execute(It.IsAny<string>()));
    // assert Add was called with an even number
    mock.Verify(foo => foo.Add(It.Is<int>(i => i % 2 == 0))); 
    // assert Add was called with a value between 1 and 10 return
    mock.Verify(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))); 

    The “It” class provides readable matching conditions and is an important part of the Moq framework.  In the next part of this series I will continue to dive deeper into this awesome mocking framework.


    There are currently no comments, be the first to post one.

    Comment Form

    Only registered users may post comments.


    2sic Daniel Mettler (124)
    Aderson Oliveira (15)
    Alec Whittington (11)
    Alex Shirley (10)
    Andrew Nurse (30)
    Anthony Glenwright (5)
    Antonio Chagoury (28)
    Ash Prasad (21)
    Ben Schmidt (1)
    Benjamin Hermann (25)
    Benoit Sarton (9)
    Beth Firebaugh (12)
    Bill Walker (36)
    Bob Kruger (5)
    Brian Dukes (2)
    Brice Snow (1)
    Bruce Chapman (20)
    Bryan Andrews (1)
    cathal connolly (55)
    Charles Nurse (163)
    Chris Hammond (203)
    Chris Paterra (55)
    Clinton Patterson (28)
    Cuong Dang (21)
    Daniel Bartholomew (2)
    Dave Buckner (2)
    David Poindexter (3)
    David Rodriguez (2)
    Doug Howell (11)
    Erik van Ballegoij (30)
    Ernst Peter Tamminga (74)
    Geoff Barlow (6)
    Gifford Watkins (3)
    Gilles Le Pigocher (3)
    Ian Robinson (7)
    Israel Martinez (17)
    Jan Blomquist (2)
    Jan Jonas (3)
    Jaspreet Bhatia (1)
    Jenni Merrifield (6)
    Joe Brinkman (269)
    John Mitchell (1)
    Jon Henning (14)
    Jonathan Sheely (4)
    Jordan Coopersmith (1)
    Joseph Craig (2)
    Kan Ma (1)
    Keivan Beigi (3)
    Ken Grierson (10)
    Kevin Schreiner (6)
    Leigh Pointer (31)
    Lorraine Young (60)
    Malik Khan (1)
    Matthias Schlomann (15)
    Mauricio Márquez (5)
    Michael Doxsey (7)
    Michael Tobisch (3)
    Michael Washington (202)
    Mike Horton (19)
    Mitchel Sellers (28)
    Nathan Rover (3)
    Navin V Nagiah (14)
    Néstor Sánchez (31)
    Nik Kalyani (14)
    Peter Donker (52)
    Philip Beadle (135)
    Philipp Becker (4)
    Richard Dumas (22)
    Robert J Collins (5)
    Roger Selwyn (8)
    Ruben Lopez (1)
    Ryan Martinez (1)
    Salar Golestanian (4)
    Sanjay Mehrotra (9)
    Scott McCulloch (1)
    Scott S (11)
    Scott Wilkinson (3)
    Scott Willhite (97)
    Sebastian Leupold (80)
    Shaun Walker (237)
    Shawn Mehaffie (17)
    Stefan Cullmann (12)
    Stefan Kamphuis (12)
    Steve Fabian (31)
    Timo Breumelhof (24)
    Tony Henrich (3)
    Torsten Weggen (2)
    Vicenç Masanas (27)
    Vincent Nguyen (3)
    Vitaly Kozadayev (6)
    Will Morgenweck (37)
    Will Strohl (163)
    William Severance (5)
    Try Evoq
    For Free
    Start Free Trial
    a Demo
    See Evoq Live
    Need More Information?