Регистрация  |  Вход

SeeAllData in Unit Tests

Приветствую всех участников форума!

Вчера пытался написать тест юнит к тригеру, который ищет определенный рекорд тайп. Выяснил, что мы не можем выполнить DML операцию с рекорд тайп. "Психанул", и включил "SeeAllData", хотя раньше до таких вещей не опускался Все заработало.

Сегодня с утра прочитал вот этот раздел в документации:
http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_testing_data_access.htm

после чего осталось больше вопросом чем ответов...

Starting with Apex code saved using Salesforce.com API version 24.0 and later, test methods don’t have access by default to pre-existing data in the organization, such as standard objects, custom objects, and custom settings data, and can only access data that they create. However, objects that are used to manage your organization or metadata objects can still be accessed in your tests such as:

User Profile Organization AsyncApexJob CronTrigger RecordType ApexClass ApexTrigger ApexComponent ApexPage

Whenever possible, you should create test data for each test. You can disable this restriction by annotating your test class or test method with the IsTest(SeeAllData=true) annotation.

(1) следует ли из сказанного, что рекод тайпы будут доступны даже если НЕ включать SeeAllData=true? получается что именно так (тригеры например определенно срабатывают когда ты пытаешься вставить тестовую дату, даже если SeeAllData не включена).

(2) получается что SeeAllData=true дает возможность видеть все данные в т.ч. в кастомных объектах. Но когда возникают практические ситуации необходимости видеть всю дату в тест юните? когда совершенно точно необходимо использовать SeeAllData=true? какие еще типы записей невозможно создать програмно, а они могут потребоваться при тестировании?

(3) И вот мы использовали SeeAllData=true в тест юните. А не получится ли так, что в принимающем орге он просто упадет, так как так может и не быть тех данных, которых юниту необходимо See?

Вот такие размышления на сегодня.

Приветствую всех участников форума!

Вчера пытался написать тест юнит к тригеру, который ищет определенный рекорд тайп. Выяснил, что мы не можем выполнить DML операцию с рекорд тайп. "Психанул", и включил "SeeAllData", хотя раньше до таких вещей не опускался  :) Все заработало.

Сегодня с утра прочитал вот этот раздел в документации:
[url]http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_testing_data_access.htm[/url]

после чего осталось больше вопросом чем ответов...

[quote]Starting with Apex code saved using Salesforce.com API version 24.0 and later, test methods don’t have access by default to pre-existing data in the organization, such as standard objects, custom objects, and custom settings data, and can only access data that they create. However, objects that are used to manage your organization or metadata objects can still be accessed in your tests such as:

    User     Profile    Organization    AsyncApexJob    CronTrigger    RecordType    ApexClass    ApexTrigger    ApexComponent    ApexPage

Whenever possible, you should create test data for each test. You can disable this restriction by annotating your test class or test method with the IsTest(SeeAllData=true) annotation.[/quote]

(1) следует ли из сказанного, что рекод тайпы будут доступны даже если НЕ включать SeeAllData=true? получается что именно так (тригеры например определенно срабатывают когда ты пытаешься вставить тестовую дату, даже если SeeAllData  не включена).

(2) получается что SeeAllData=true дает возможность видеть все данные в т.ч. в кастомных объектах. Но когда возникают практические ситуации необходимости видеть всю дату в тест юните? когда совершенно точно необходимо использовать SeeAllData=true? какие еще типы записей невозможно создать програмно, а они могут потребоваться при тестировании?

(3) И вот мы использовали  SeeAllData=true в тест юните. А не получится ли так, что в принимающем орге он просто упадет, так как так может и не быть тех данных, которых юниту необходимо See?

Вот такие размышления на сегодня.

1. Именно так. RecordType доступны без SeeAllData=true.

2, 3 Да все правильно. По умолчанию тесты не могут иметь доступ к реальным данным на орге, пока ты не укажешь это с помощью аннотации SeeAllData. Но не советую этим пользоваться. Тесты становятся зависимыми от среды выполнения, а это чревато проблемами с большим количеством клиентов (упадут если не будет каких либо данных)

RecordType, как и некоторые другие объекты SF (User Profile Organization AsyncApexJob CronTrigger RecordType ApexClass ApexTrigger ApexComponent ApexPage) являются служебными и их нельзя просто так создать, и видимость их в тестах выходит из общих правил.

1. Именно так. RecordType доступны без SeeAllData=true.

2, 3 Да все правильно. По умолчанию тесты не могут иметь доступ к реальным данным на орге, пока ты не укажешь это с помощью аннотации SeeAllData. Но не советую этим пользоваться. Тесты становятся зависимыми от среды выполнения, а это чревато проблемами с большим количеством клиентов (упадут если не будет каких либо данных)

RecordType, как и некоторые другие объекты SF (User Profile Organization AsyncApexJob CronTrigger RecordType ApexClass ApexTrigger ApexComponent ApexPage) являются служебными и их нельзя просто так создать, и видимость их в тестах выходит из общих правил.

спасибо Дмитрий

Dmitry Shnyrev
Тесты становятся зависимыми от среды выполнения.
- вот это хорошо сказано.

и вопрос: кто-нибудь ставил на практике SeeAllData в тест? какая ситуация вас заставила это сделать?

спасибо Дмитрий

[quote="Dmitry Shnyrev"] Тесты становятся зависимыми от среды выполнения.[/quote] - вот это хорошо сказано.

и вопрос: кто-нибудь ставил на практике SeeAllData в тест? какая ситуация вас заставила это сделать?

1. SeeAllData=true ставится в случае использования PriceBook. Потому что в тестах нельзя создать default PriceBook.
2. В случае если вы используете поля Currency 16,2 в частности. Это связано с какими-то проблемами на стороне явы и конвертации валюты. Почему-то когда этот флаг есть конвертация работает правильно.

1. SeeAllData=true ставится в случае использования PriceBook. Потому что в тестах нельзя создать default PriceBook. 
2. В случае если вы используете поля Currency 16,2 в частности. Это связано с какими-то проблемами на стороне явы и конвертации валюты. Почему-то когда этот флаг есть конвертация работает правильно.