Модульное тестирование с использованием Moq, код с использованием Linq to Sql для хранимой процедуры - PullRequest
1 голос
/ 10 сентября 2009

Я очень плохо знаком с TDD, ASP.NET MVC и LinqToSql. Я пытаюсь написать тесты для своего репозитория, который получает данные из хранимой процедуры с использованием LinqToSql.

Это тестируемый метод хранилища:

public int GetResponseCount(int campaignId)
{
    var results = (new MyDBDataContext()).GetResponseCountById(campaignId);
    foreach (GetResponseCountByIdResult result in results)
    {
 return (result.ResponseCount != null) ? result.ResponseCount.Value : 0;
    }
    return 0;
}

Это код в тесте:

var myDBDataContext = new Mock<MyDBDataContext>();
var result = new Mock<ISingleResult<GetResponseCountByIdResult>>().Object();
myDBDataContext.Setup(x => x.GetResponseCountById(It.IsAny<int>())).Returns(result).Verifiable();
...
...

Есть 2 вопроса:

1) Проверенная процедура возвращает один целочисленный результат. Но мне нужно перебрать ответ от LinqToSql, чтобы получить значение. Что не идеально. Есть ли лучший способ сделать это?

2) Код в тесте не компилируется. Компилятор говорит - Невозвратный член 'Moq.Mock<System.Data.Linq.ISingleResult<GetResponseCountByResult>>.Object' cannot be used like a method. Как я могу написать тест, чтобы убедиться, что мой метод репозитория вызывает правильный метод в LinqToSql?

Большое спасибо!

1 Ответ

1 голос
/ 11 сентября 2009

Я был бы склонен инкапсулировать доступ к вашему DataContext, чтобы вы могли перехватить доступ к нему (и, таким образом, посмеяться над DC) для модульного тестирования. Этот подход позволяет адаптировать ваши запросы для получения единственного результата, когда вам необходимо:

public class MyDataAccess{
  public X GetMyX(){
    using (var ctx = new DataContext()){
      return (from x in ctx.TheXs where... select x).FirstOrDefault();
    }
  }
}

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

С наилучшими пожеланиями,

Андрей

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