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

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

Всем привет. Нужна Ваша помощь, потому что совсем нет идей, как это сделать.

Есть код(полный код очень длинный), основная суть его в том, что на странице Visualfroce есть некая таблица с полями и в этой таблице есть поле isDel, которое создано во внутреннем классе inClass{}(скорее всего неверная формулировка, поправьте, если так). Поле isDel необходимо для удаления. При удалении проверяется, есть ли поля с isDel==true, если да, то удаляются.

Так вот, тесты не проходят дальше проверки условия if(isDel==true).
isDel - это НЕ кастомное поле isDel__c и оно не создано так же как и все поля в объекте, поэтому я не могу его вызвать и заменить с помощью:

primer__c zadacha = new primer__c();
zadacha.isDel = ....

Вот мини пример кода:

public class kakClass{
class inClass{
public Boolean isDel {get;set;}
public primer__c pri {get;set;} //primer__c - объект с рандомными полями и записями
public inClass(primer__c a1){
pri = a1;
isDel = false;
}
}
}

Необходимо написать тесты для этого класса, но я не знаю как вызвать isDel и заменить его на true.
Буду рад любой помощи.

Всем привет. Нужна Ваша помощь, потому что совсем нет идей, как это сделать.

Есть код(полный код очень длинный), основная суть его в том, что на странице Visualfroce есть некая таблица с полями и в этой таблице есть поле isDel, которое создано во внутреннем классе inClass{}(скорее всего неверная формулировка, поправьте, если так). Поле isDel необходимо для удаления. При удалении проверяется, есть ли поля с isDel==true, если да, то удаляются.

Так вот, тесты не проходят дальше проверки условия if(isDel==true).
isDel - это НЕ кастомное поле isDel__c и оно не создано так же как и все поля в объекте, поэтому я не могу его вызвать и заменить с помощью:

 primer__c zadacha = new primer__c(); 
 zadacha.isDel = ....

Вот мини пример кода:

public class kakClass{
  class inClass{
     public Boolean isDel {get;set;}
     public primer__c pri {get;set;} //primer__c - объект с рандомными полями и записями
        public inClass(primer__c a1){
            pri = a1;
            isDel = false;
        }
  }
}

Необходимо написать тесты для этого класса, но я не знаю как вызвать isDel и заменить его на true.
Буду рад любой помощи.


kakClass.inClass test123 = new kakClass.inClass([SELECT ID FORM primer__c LIMIT 1]);
test123.isDel = true;

[code]kakClass.inClass test123 = new kakClass.inClass([SELECT ID FORM primer__c LIMIT 1]);
test123.isDel = true;[/code]

Как раз пришел к такому коду и заглянул сюда, большое спасибо)

Теперь появился новая задача, как заинсертить новую запись с полем isDel = true, но написанный ниже пример и некоторые другие не проходят:

primer__c zadacha = new primer__c(
Name__c = 'name1'
);

kakClass.inClass test123 = new kakClass.inClass(zadacha);
test123.isDel = true;
insert zadacha;

Плюс нашел ошибку из-за которой примерно такой же код не работал раньше, возможно будет полезно для тех, кто столкнется с таким же:
1) inClass не был определен, как public.
2) new kakClass.inClass(...); - скобка была пустой.

Как раз пришел к такому коду и заглянул сюда, большое спасибо)

Теперь появился новая задача, как заинсертить новую запись с полем isDel = true, но написанный ниже пример и некоторые другие не проходят:

[code]
        primer__c zadacha = new primer__c(
            Name__c = 'name1'
        );
             
        kakClass.inClass test123 = new kakClass.inClass(zadacha);
        test123.isDel = true;
        insert zadacha;
[/code]

Плюс нашел ошибку из-за которой примерно такой же код не работал раньше, возможно будет полезно для тех, кто столкнется с таким же: 
1) inClass не был определен, как public. 
2) new kakClass.inClass(...); - скобка была пустой.




insert test123.pri;

Для начала научитесь правильно и со смыслом называть переменные. После этого сразу станет понятно что и откуда надо дергать.

[code]insert test123.pri;[/code]

Для начала научитесь правильно и со смыслом называть переменные. После этого сразу станет понятно что и откуда надо дергать.

Кстати ваш вариант тоже рабочий

primer__c zadacha = new primer__c(Name__c = 'name1');
kakClass.inClass test123 = new kakClass.inClass(zadacha);
test123.isDel = true;
insert zadacha;

только он не имеет особого смысла в вашем случае.

Кстати ваш вариант тоже рабочий
[code]primer__c zadacha = new primer__c(Name__c = 'name1');
kakClass.inClass test123 = new kakClass.inClass(zadacha);
test123.isDel = true;
insert zadacha;[/code]
только он не имеет особого смысла в вашем случае.

Dmitry Shnyrev
insert test123.pri;

Для начала научитесь правильно и со смыслом называть переменные. После этого сразу станет понятно что и откуда надо дергать.

Благодарю, код оказался полезен. Только возникла ошибка, которую исправил заменой insert test123.pri; на update test123.pri;.

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

Да, этот код рабочий, но в моем случае он не делал то, что я от него ждал. Поэтому и выразился так.

Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true). Все прекрасно покрывается текстами, когда во внутреннем классе(inClass) я меняю изначальное значение isDel на true. Но если значение задается false, то дальше проверки не проходит.

Возможно, когда я вызываю метод удаления, таким способом:

kakClass controller = new kakClass();
controller.delete();

то оно не учитывает эту измененную запись. Пока что думаю, как это исправить.

[quote="Dmitry Shnyrev"][code]insert test123.pri;[/code]

Для начала научитесь правильно и со смыслом называть переменные. После этого сразу станет понятно что и откуда надо дергать.[/quote]

Благодарю, код оказался полезен. Только возникла ошибка, которую исправил заменой insert test123.pri; на update test123.pri;. 

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

Да, этот код рабочий, но в моем случае он не делал то, что я от него ждал. Поэтому и выразился так.

Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true). Все прекрасно покрывается текстами, когда во внутреннем классе(inClass) я меняю изначальное значение isDel на true. Но если значение задается false, то дальше проверки не проходит.

Возможно, когда я вызываю метод удаления, таким способом:
[code]
kakClass controller = new kakClass();
controller.delete();
[/code]
то оно не учитывает эту измененную запись. Пока что думаю, как это исправить.

artmat
Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true).

Что-то я не нахожу исходного текста тестов с этой строкой. Как можно понять что там происходит ДО "условия if(isDel==true)"

[quote="artmat"]Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true). [/quote]
Что-то я не нахожу исходного текста тестов с этой строкой. Как можно понять что там происходит ДО "условия if(isDel==true)" 

Dmitry Shnyrev
artmat
Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true).

Что-то я не нахожу исходного текста тестов с этой строкой. Как можно понять что там происходит ДО "условия if(isDel==true)"

public void delete(){

if(wrapperlst.size()>0){
List<primer__c> stuList = new List<primer__c>();
for(inClass wrap : wrapperlst){
if(wrap.isDel == true)
stuList.add(wrap.pri);
}

1) wrapperlst - это list, который содержит все записи объекта
2) stuList.add(wrap.pri); - эта строка не покрывается, т.к. условия не true

[quote="Dmitry Shnyrev"][quote="artmat"]Теперь ошибок нет, но при тестировании кнопки удаления, опять не проходит дальше проверки условия if(isDel==true). [/quote]
Что-то я не нахожу исходного текста тестов с этой строкой. Как можно понять что там происходит ДО "условия if(isDel==true)"[/quote]

[code]
public void delete(){
        
        if(wrapperlst.size()>0){
            List<primer__c> stuList = new List<primer__c>();
            for(inClass wrap : wrapperlst){
                if(wrap.isDel == true)
                    stuList.add(wrap.pri);
            }
[/code]

1) wrapperlst - это list, который содержит все записи объекта
2) stuList.add(wrap.pri); - эта строка не покрывается, т.к. условия не true

Ну судя по коду получается что вся проблема во wrapperlst.
Остается узнать как он формируется в тестах и что в нем находится перед стройкой

for(inClass wrap : wrapperlst){

Ну судя по коду получается что вся проблема во wrapperlst.
Остается узнать как он формируется в тестах и что в нем находится перед стройкой
[code]for(inClass wrap : wrapperlst){[/code]

Dmitry Shnyrev
Ну судя по коду получается что вся проблема во wrapperlst.
Остается узнать как он формируется в тестах и что в нем находится перед стройкой
for(inClass wrap : wrapperlst){

Как мне кажется, раз условие if(wrapperlst.size()>0) = true, то записи к нему должна была добавиться. Видимо я как-то не учитываю конструктор inClass.

public class inClass{
public primer__c pri {get;set;}
public Boolean IsSelDelete {get;set;}
public inClass(primer__c otobrazit){
pri = otobrazit;
IsSelDelete = false;
}
}

public List<inClass> wrapperlst {get;set;}
public kakClass(){
buKiri();
}

public void buKiri(){
wrapperlst = new List<inClass>();
for(primer__c otobrazit : Database.query('SELECT Name__c FROM primer__c '))
wrapperlst.add(new inClass(otobrazit));
}

[quote="Dmitry Shnyrev"]Ну судя по коду получается что вся проблема во wrapperlst.
Остается узнать как он формируется в тестах и что в нем находится перед стройкой
[code]for(inClass wrap : wrapperlst){[/code][/quote]

Как мне кажется, раз условие if(wrapperlst.size()>0) = true, то записи к нему должна была добавиться. Видимо я как-то не учитываю конструктор inClass.
[code]
public class inClass{
        public primer__c pri {get;set;}
        public Boolean IsSelDelete {get;set;}
        public inClass(primer__c otobrazit){
            pri = otobrazit;
            IsSelDelete = false;
        }
    }
      
    public List<inClass> wrapperlst {get;set;}
    public kakClass(){
        buKiri();
    }

    public void buKiri(){
        wrapperlst = new List<inClass>();
        for(primer__c otobrazit : Database.query('SELECT Name__c FROM primer__c '))
            wrapperlst.add(new inClass(otobrazit));
    }
[/code]

Если я правильно понял isDel и IsSelDelete это одно и тоже просто переименованное.

Если так, то я в последнем примере не вижу чтобы IsSelDelete где-то переводился в True.
Вижу что по-умолчанию в конструкторе он выставляется в False. И все!

Поэтому условие

if(wrap.isDel == true)

не срабатывает

Если я правильно понял isDel и IsSelDelete это одно и тоже просто переименованное. 

Если так, то я в последнем примере не вижу чтобы IsSelDelete где-то переводился в True.
Вижу что по-умолчанию в конструкторе он выставляется в False. И все!

Поэтому условие 
[code]if(wrap.isDel == true)[/code]
не срабатывает

Dmitry Shnyrev
Если я правильно понял isDel и IsSelDelete это одно и тоже просто переименованное.

Если так, то я в последнем примере не вижу чтобы IsSelDelete где-то переводился в True.
Вижу что по-умолчанию в конструкторе он выставляется в False. И все!

Поэтому условие

if(wrap.isDel == true)

не срабатывает

Да, isDel и IsSelDelete одно и тоже, прошу прощения. Если я вас правильно понял, то в самой программе на Visualforce странице isDel(IsSelDelete) является полем(inputCheckbox) в таблице. При нажатии на который, inputCheckbox и переводится в true, после чего кнопка удалить(метод delete()) и данная запись удаляется.

Если же вы имели ввиду текст самих тестов, то вот, что у меня выходит на данный момент:

primer__c zadacha = new primer__c(
Name = 'Name1'
);
insert zadacha;

kakClass controller = new kakClass();

kakClass.inClass func = new kakClass.inClass(zadacha);
func.isDel = true;
update func.pri;

controller.delete();

[quote="Dmitry Shnyrev"]Если я правильно понял isDel и IsSelDelete это одно и тоже просто переименованное. 

Если так, то я в последнем примере не вижу чтобы IsSelDelete где-то переводился в True.
Вижу что по-умолчанию в конструкторе он выставляется в False. И все!

Поэтому условие 
[code]if(wrap.isDel == true)[/code]
не срабатывает[/quote]

Да, isDel и IsSelDelete одно и тоже, прошу прощения. Если я вас правильно понял, то в самой программе на Visualforce странице isDel(IsSelDelete) является полем(inputCheckbox) в таблице. При нажатии на который, inputCheckbox и переводится в true, после чего кнопка удалить(метод delete()) и данная запись удаляется.

Если же вы имели ввиду текст самих тестов, то вот, что у меня выходит на данный момент:
[code]
primer__c zadacha = new primer__c(
            Name = 'Name1'
        );
insert zadacha;
        
kakClass controller = new kakClass();
        
kakClass.inClass func = new kakClass.inClass(zadacha);
func.isDel = true;
update func.pri;
        
controller.delete();
[/code] 

Суда по коду теста ваш func никак не передается в controller. Он тупо болтается отдельно, а контроллер про него ничего не знает.

Суда по коду теста ваш func никак не передается в controller. Он тупо болтается отдельно, а контроллер про него ничего не знает.

Советую разобраться с Developer Console и магической штукой
System.debug(<your_var>)
чтобы расставить по коду вывод в консоль основных переменных.
После этого запускать тесты и контролировать что выводится в логах.
Тогда все станет проще понимать почему не работает.

Советую разобраться с Developer Console и магической штукой
System.debug(<your_var>) 
чтобы расставить по коду вывод в консоль основных переменных. 
После этого запускать тесты и контролировать что выводится в логах. 
Тогда все станет проще понимать почему не работает.

Dmitry Shnyrev
Советую разобраться с Developer Console и магической штукой
System.debug(<your_var>)
чтобы расставить по коду вывод в консоль основных переменных.
После этого запускать тесты и контролировать что выводится в логах.
Тогда все станет проще понимать почему не работает.

В Developer Console и пишу. Через apex anonymous пробовал удалить запись с помощью своего контроллера, но безуспешно. System.debug() использую, проследил, что запись поменяла isDel на true и после вызовов различным методов она так и осталась true, но не удалилась. Судя по этому, как вы верно подметили, func не передается в controller и тупо болтается отдельно, а контроллер про него ничего не знает. Возникает логичный вопрос. Как сделать так, что бы controller узнал про func, а точнее func передалась в controller?

[quote="Dmitry Shnyrev"]Советую разобраться с Developer Console и магической штукой
System.debug(<your_var>) 
чтобы расставить по коду вывод в консоль основных переменных. 
После этого запускать тесты и контролировать что выводится в логах. 
Тогда все станет проще понимать почему не работает.[/quote]

В Developer Console и пишу. Через apex anonymous пробовал удалить запись с помощью своего контроллера, но безуспешно. System.debug() использую, проследил, что запись поменяла isDel на true и после вызовов различным методов она так и осталась true, но не удалилась. Судя по этому, как вы верно подметили, func не передается в controller и тупо болтается отдельно, а контроллер про него ничего не знает. Возникает логичный вопрос. Как сделать так, что бы controller узнал про func, а точнее func передалась в controller?

Dmitry Shnyrev
Суда по коду теста ваш func никак не передается в controller. Он тупо болтается отдельно, а контроллер про него ничего не знает.

Появились идеи:
func. - после точки есть 3 варианта, 2 из которых были использованы, но 3-ий еще нет:
1) func.isDel
2) func.pri
3) func.inClass(otobrazit)

Что можно сделать с func.inClass(otobrazit)? Если я правильно понимаю, то это конструктор inClass, в нем и объявляется isDel=false. Можно ли тогда с помощью func.inClass(otobrazit) задать isDel=true, как по умолчанию. Если можно то, как это сделать?

[quote="Dmitry Shnyrev"]Суда по коду теста ваш func никак не передается в controller. Он тупо болтается отдельно, а контроллер про него ничего не знает.[/quote]

Появились идеи:
 func. - после точки есть 3 варианта, 2 из которых были использованы, но 3-ий еще нет:
 1) func.isDel
 2) func.pri
 3) func.inClass(otobrazit)

Что можно сделать с func.inClass(otobrazit)? Если я правильно понимаю, то это конструктор inClass, в нем и объявляется isDel=false. Можно ли тогда с помощью func.inClass(otobrazit) задать isDel=true, как по умолчанию. Если можно то, как это сделать?