Проблемы с пониманием, как проверить некоторые вещи - PullRequest
2 голосов
/ 23 января 2012

Не уверен, что мне нужно делать здесь. У меня есть частные методы, которые делают вызовы базы данных для извлечения значений, которые просматриваются, а затем возвращают значения вызывающей стороне. Я посмотрел на Мок, но я не уверен, что это то, что мне нужно.

Пример одного из моих методов:

    private bool ClientIdMatchesUserId(int userId, Guid clientId, out string message)
    {
        bool idsMatch;

        const string sql = "sql goes here";

        int result = (int)SqlHelper.ExecuteScalar(Connection, CommandType.Text, sql);
        if (result != 1)
        {
            idsMatch = false;
            message = "ClientId does not match.";
        }
        else
        {
            idsMatch = true;
            message = "ClientId matches.";
        }

        return idsMatch;
    }

Что меня смущает, так это 1) У меня есть приватный метод и 2) У него есть параметры.

Мок мне нужен? Нужно ли создавать тестовую базу данных с известными значениями?

Я должен добавить, что я новичок в тестировании и могу использовать все советы, которые я могу получить;)

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Чтобы выполнить модульное тестирование класса, вам необходимо отделить доступ к базе данных от бизнес-логики. В этот момент вы можете смоделировать зависимости и протестировать класс через его открытый интерфейс.

Вот один пример того, как это можно сделать.

public class User
{
    // properties map to columns
    // Consider using NHibernate, Entity Framework, etc.
}

// ALL database access goes through interface implementations.
public interface IUserRepository
{
    // One of several options - TryParse pattern
    bool TryGetById(int userId, out User user);
}

public class SomeBusinessLogic
{
    public SomeBusinessLogic(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public string ValidateClient(int userId)
    {
        // Probably more logic here.
        string message;
        bool result = ClientIdMatchesUserId(userId, out message);

        if (result)
        {
            return string.Empty;
        }

        return message;
    }

    private bool ClientIdMatchesUserId(int userId, out string message)
    {
        User user;
        bool found = _userRepository.TryGetById(userId, out user);

        message =
            found
            ? "ClientId matches."
            : "ClientId does not match.";

        return found;
    }

    private readonly IUserRepository _userRepository;
}

Тогда ваши тесты будут выглядеть примерно так:

[Test]
public void ValidateClient_WhenValid_ReturnsEmptyString()
{
    // Arrange
    const int UserId = 1234;
    var mockRepo = new Mock<IUserRepository>();
    var user = new User();
    mockRepo.Setup(x => x.TryGetById(UserId, out user)).Returns(true);
    var sut = new SomeBusinessLogic(mockRepo.Object);

    // Act
    string result = sut.ValidateClient(UserId);

    // Assert
    Assert.That(result, Is.EqualTo(string.Empty));
}

[Test]
public void ValidateClient_WhenInvalid_ReturnsMessage()
{
    // Arrange
    var mockRepo = new Mock<IUserRepository>();
    var sut = new SomeBusinessLogic(mockRepo.Object);

    // Act
    string result = sut.ValidateClient(1234);

    // Assert
    Assert.That(result, Is.EqualTo("ClientId does not match."));
}

Я бы рекомендовал прочитать Искусство модульного тестирования с примерами в .NET , чтобы лучше понять это. Это сложная тема.

0 голосов
/ 23 января 2012

Я бы проверил Кротов. http://research.microsoft.com/en-us/projects/pex/downloads.aspx

Moq используется для макетирования зависимостей интерфейса или зависимостей, которые являются публичными классами с конструктором по умолчанию и виртуальными методами. Moles позволяет вам высмеивать в основном все, что угодно, и специально разработан для насмешки над внешними зависимостями, такими как базы данных, файлы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...