Как люди тестируют модульный код, использующий Linq для SQL

StackOverflow https://stackoverflow.com/questions/52657

  •  09-06-2019
  •  | 
  •  

Вопрос

Как люди тестируют модульный код, использующий Linq to SQL?

Это было полезно?

Решение

Обновить:

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

http://web.archive.org/web/20120415022448/http://iridescence.no/post/DataContext-Repository-Pattern-Example-Code.aspx

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

Мой старый пост:

* Я нашел эти блоги, которые, по моему мнению, являются хорошим началом для создания оболочки DataContext:Ссылка 1 Ссылка 2

Они охватывают почти ту же тему, за исключением того, что в первом из них реализованы средства для извлечения интерфейсов и для таблиц.Однако второй вариант более обширный, поэтому я включил и его.*

Другие советы

с опозданием на 3 года, но вот как я это делаю:

https://github.com/lukesampson/LinqToSQL-test-extensions/

Не нужно писать оболочку или выполнять много сантехнических работ, просто поместите шаблон T4 рядом с вашим .dbml, и вы получите:

  1. Интерфейс для вашего контекста данных, напримерIExampleDataContext IExampleDataContext
  2. Макет в памяти для вашего контекста данных, напримерMemoryExampleDataContext ( Память )

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

Таким образом, вы можете делать такие вещи, как

public class ProductRepo {
    IExampleDataContext DB { get; set };
    public ProductRepo(IExampleDataContext db) {
        DB = db;
    }

    public List<Product> GetProducts() {
        return DB.Products.ToList();
    }
}

и вы можете назвать это любым из двух способов

new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing

или

new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB

Оберните DataContext, затем смоделируйте оболочку.Это самый быстрый способ сделать это, хотя для этого требуется кодирование для тестирования, которое, по мнению некоторых людей, дурно пахнет.Но иногда, когда у вас есть зависимости, которые нельзя (легко) подделать, это единственный способ.

Linq значительно упрощает тестирование.Запросы Linq работают со списками так же хорошо, как и с материалами Linq-to-sql.Вы можете заменить Linq на SQL для объектов списка и протестировать этот способ.

Мэттвар там , в Своенравный веб - журнал у меня была отличная статья о том, как создать макет расширяемого контекста данных Linq2SQL.Зацени это -- MOCKS NIX - РАСШИРЯЕМЫЙ LINQ ДЛЯ SQL DATACONTEXT

Обычно вам не нужно тестировать ту часть кода, которая использует LINQ to SQL, но если вы действительно хотите, вы можете использовать те же наборы данных, которые вы запрашиваете у сервера, и превратить их в объекты в памяти и запускать запросы LINQ к ним (которые будут использовать перечислимые методы вместо запрашиваемых).

Другой вариант - использовать метод Мэтта Уоррена макетная версия DataContext.

Вы также можете получить инструкции SQL, которые использует LINQ to SQL, получив их через отладчик (из объекта IQueryable), проверить их вручную, а затем включить в автоматизированные тесты.

LINQ to SQL на самом деле действительно хорош для модульного тестирования, поскольку у него есть возможность создавать базы данных "на лету" из того, что определено в вашем DBML.

Это делает действительно приятным тестирование уровня ORM, создавая базу данных через DataContext и оставляя ее пустой для начала.

Я рассказываю об этом в своем блоге здесь: http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top