Как добавить moq в работающий тестовый модуль mstest - PullRequest
4 голосов
/ 24 ноября 2011

Я использую MSTest для написания модульных тестов, но мне было поручено добавить moq в модульный тест.Я понимаю, что если проводится интеграционный тест, в котором обычно вызывается файловая система, база данных, то по сути, имитация позволяет проводить тестирование, фактически не совершая эти «настоящие» вызовы.Я оглянулся и просто нуждался в помощи.

Я начал с некоторых базовых утилит, которые нашел, и начал с базового тестирования их с помощью Asserts.Тем не менее, мне нужно перейти к следующему шагу и использовать MOQ.

Вот метод, который я тестирую:

    public static bool IsStringEmptyOrNull(string strValue)
    {
        if(null != strValue)
        {
            strValue = strValue.Trim().ToLower();
            return (string.Empty == strValue || "undefined" == strValue);
        }
        return true;
    }

Затем у меня есть тест, который выглядит следующим образом:

  using System;
  using System.Text;
  using System.Collections.Generic;
  using System.Linq;
  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using Company.W.Utilities;


namespace CESUtilities.Tests
{
[TestClass]
public class When_string_is_empty_or_null
{
    private string empty;
    private string isnull;
    private bool expected;

    [TestInitialize()]
    public void TestInitialize()
    {
        empty = "";
        isnull = null;
        expected = true;
    }

    [TestMethod]
    public void when_string_is_empty()
    {

        bool actual = Util.IsStringEmptyOrNull(empty);   
        Assert.AreEqual(expected, actual);
    }

    [TestMethod]
    public void when_string_is_null()
    {
        bool actual = Util.IsStringEmptyOrNull(isnull);
        Assert.AreEqual(expected, actual);
    }



    [TestCleanup()]
    public void TestCleanup()
    {

    }


  }
}

1 Ответ

13 голосов
/ 24 ноября 2011

Прежде всего, как вы упомянули, вы можете заменить зависимости на макеты. Код, который вы опубликовали, не содержит большого количества зависимостей, но давайте представим, что он есть.

Вы тестируете метод IsStringEmptyOrNull.

Давайте предположим, что метод принадлежит классу с именем Foo (я просто придумываю). Я тоже немного поменяю метод.

public class Foo
{
    private IBar _bar;

    public Foo(IBar bar)
    {
        _bar = bar; 
    }   

    public static bool IsStringEmptyOrNull(string strValue)
    {
        // dependency is called here
        var readValue = bar.ReadFromFileSystemOrDatabase();

        if(null != strValue 
           && readValue == 1)
        {
            strValue = strValue.Trim().ToLower();
            return (string.Empty == strValue || "undefined" == strValue);
        }
        return true;
    }
}

Здесь вы можете видеть, что у класса Foo есть Bar, который вставляется в конструктор. Также он используется в вашем методе. Если вы не хотите, чтобы ваш тест действительно вызывал этот метод:

  • потому что он звонит в db
  • потому что он обращается к файловой системе
  • вы хотите изолировать код от метода, от другого внешнего кода (в данном случае ReadFromFileSystemOrDatabase ()

Затем вы можете использовать макет, чтобы подтвердить это. Вот как бы вы это сделали:

// create your mock object
var mockBar = new Mock<IBar>();

// setup a method to return a result when the mock object is called
// notice the return value, which is 1
mockBar.Setup(mock => mock.ReadFromFileSystemOrDatabase()).Returns(1);

// you can then inject the mock object in the object you are testing
var foo = new Foo(mockBar.Object);

То, что произойдет, это то, что при выполнении теста классу будет передана фиктивная версия зависимости (в данном случае Bar).

Когда метод вызовет этот макет, если у вас есть Setup метод для возврата значения, он вернет это значение.

Таким образом, вы можете абстрагировать зависимости, чтобы сфокусировать свои тесты или смоделировать вызовы в БД или в файловую систему.

Что касается приведенного вами точного примера, то тут не над чем издеваться. Точный пример не подходит для использования макетов.

Мухи - это не то, что вы бы сделали для всех своих тестов.

...