Как я дразню IQueryable <T>

Я создаю репозиторий, который выставляет IQueryable. Что лучший способ состоит в том, чтобы дразнить это за мое поблочное тестирование?

Так как я использую RhinoMocks для остальной части моих фиктивных объектов, я пытался сделать следующее:

IQueryable QueryObject = 
    MockRepository.GenerateStub>();

Это не работает, хотя, таким образом, я пытался делать это:

IQueryable QueryObject = 
    (new List { new MyObject() }).AsQueryable();

Существует ли лучший способ сделать это, или какие-либо другие платформы насмешки создали поддержку IQueryable в?

Мой интерфейс репозитория похож на это:

public interface IRepository where T : TableServiceEntity
{
    IQueryable Table { get; }
    void Attach(T existingItem);
    void Delete(T itemToDelete);
    void Insert(T newItem);
    T Load(string partitionKey, string rowKey);
    IEnumerable Load(string partitionKey);
    IEnumerable Query(IQueryable query);
    IEnumerable Last(int count);
    T Last();
    void Update(T item);
}

Вот метод, который я хочу протестировать:

public Post LoadPost(int year, int month, int day, string slug)
{
    var query = from p in _blogRepository.Table
                where 
                    p.PartitionKey == Key.Partition(year, month, day) 
                    && p.Slug == slug
                select p;

    var posts = _blogRepository.Query(query.Take(1));

    return posts.First();
}

Затем вот тест, поскольку у меня есть он прямо сейчас, который протестирует LoadPost.

[Fact]
public void LoadWillRetrieveByPartitionKeyAndRowKeyWhenUsingUriFormat()
{
    Repository
        .Stub(x => x.Query(Arg>.Is.Anything))
        .Return(new List {_post});

    var result = Service.LoadPost(
                            _post.Year(),
                            _post.Month(), 
                            _post.Day(), 
                            _post.Slug);

    Assert.NotNull(result);
}

Код взят из моего проекта AzureBlog.

35
задан Aaron Weiker 12 February 2010 в 04:39
поделиться

3 ответа

mysql эквивалент верхнего и вы можете найти больше о LIMIT в MySql Doc

-121-2321892-

Это одна из тех сложных частей, как выполняется поиск имени.

В C++ есть две области идентификаторов: одна для типов классов и общая область идентификаторов. Значение перечисления BAD находится в области общего идентификатора, а тип класса BAR - в области идентификатора класса. Именно поэтому вам разрешено иметь как значение перечисления, так и класс с одинаковым именем: оба имени не сталкиваются.

В классе BAD правила поиска идентификаторов обнаружат класс BAD до того, как он найдет перечисление и, следовательно, ошибку. Теперь, если вы полностью квалифицировали идентификатор, то поиск имени сначала проверит область глобального идентификатора и сопоставит значение перечисления. На противоположном конце необходимо добавить ключевое слово struct или class для объявления переменных типа BAD.

namespace foo {
   enum bad { BAD; };
   class BAD {
      void worse() { bad b = ::foo::BAD; } // fully qualified will match the enum
   };
}
int main() {
   // foo::BAD b;    // error, foo::BAD is an enum, not a type
   class foo::BAD b; // correct
}

Теперь, я бы посоветовал против этого использования. Как правило, не рекомендуется повторно использовать такой идентификатор. Код будет более сложным и, вероятно, вводящим в заблуждение для случайного читателя (один и тот же неквалифицированный идентификатор относится к разным вещам при использовании в разных контекстах). Если имена действительно должны быть BAD , попробуйте использовать включающее пространство имен или класс для класса или перечисления (предпочтительнее перечисление).

-121--2980821-

Обычно я делаю именно то, что вы сделали в своем тесте. При написании тестов я предполагаю, что классы библиотеки .NET работают правильно и не содержат ошибок, поэтому я могу использовать их в тестах. Когда мне нужен список тестов, коллекция, запрос, словарь и т.д. Я просто создаю реальную вещь и заполняю ее тестовыми данными. Это делает тесты гораздо более читаемыми и более быстрыми для записи, и, если честно, риск отсутствует.

10
ответ дан 27 November 2019 в 15:47
поделиться

Если вы хотите поиздеваться над своим хранилищем, вы не будете издеваться над IQueryable. Вместо этого издевайтесь над методами хранилища, возвращающими фиксированные, известные значения (как в вашем втором примере), которые можно использовать для запуска юнит-тестов.

4
ответ дан 27 November 2019 в 15:47
поделиться

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

Я начал с создания интерфейса (IRepository), который включал метод IQueryable. Затем я создал два класса, реализующих этот интерфейс. Один класс использует ORM для манипулирования данными (DbEntityRepository), а другой класс использует свойство класса (MemoryRepository). Класс контекста данных имел конструктор, который требовал IRepository. Таким образом, я мог использовать MemoryRepository для тестирования контекста данных и использовать DbEntityRepository для приложения.

Если вам интересно... вы можете найти код на codeplex: IQToolkitContrib

0
ответ дан 27 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: