2009-10-16 2 views
1

Я пытаюсь модифицировать некоторые тесты, используя Test::More для устаревшего кода, и я столкнулся с некоторой проблемой. Кажется, я не могу установить %ENV в тестовом модуле. Вызываемая функция определенно использует эту переменную, поэтому %ENV, похоже, не переносится на тестовый объект.Как я могу издеваться над% ENV в тестах Perl?

#!/usr/bin/perl 

use strict; use warnings; 
use Test::More qw(no_plan); 

BEGIN { 
    $ENV{HTTP_WWW_AUTHENTICATE} = 
     'WWW-Authenticate: MyType realm="MyRealm",userid="123",password="abc"'; 
    use_ok('Util'); 
} 

$ENV{HTTP_WWW_AUTHENTICATE} = 
    'WWW-Authenticate: MyType realm="MyRealm",userid="123",password="abc"'; 

printf qq{get_authentication_info = "%s"\n}, get_authentication_info(); 
ok(get_authentication_info(), 'Get authentication info'); 

я получаю ...

 
perl t\Util.t 
ok 1 - use Util; 
Use of uninitialized value in concatenation (.) or string at t\Util.t line 14. 
get_authentication_info = "" 

Как и со всеми вещами Perl, я уверен, что кто-то сделал это раньше.

UPDATE: Спасибо всем за вашу помощь

Проблема была между стулом клавиатуры & ... Мой тест данных был просто неправильно Это должно было быть

$ENV{HTTP_WWW_AUTHENTICATE} = 
    'MyType realm="MyRealm",userid="123",password="abc"'; 
+0

OK комментариев нет в исполняемом файле ... они просто показывают, где я пытался установить% ENV БЕЗ комментариев. – telesphore4

+0

Почему вы прокомментировали строки, которые задают переменную env? – Thushan

+1

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

ответ

2

Что

get_authentication_info() 

возвращение?

Моя догадка - ничто.

Если это всегда так, то строка 14 всегда возвращает предупреждение «Использование неинициализированного значения ...».

Если вы ожидаете значения, вам нужно выяснить, почему get_authentication_info() не работает?

+0

Не совсем, но закрыть enuf, чтобы направить меня на правильный путь – telesphore4

+0

Так что же произошло именно так? Не оставляйте нас в темноте! – Ether

2

Почему строки запустили $ENV{HTTP_WWW_AUTHENTICATE}?

Кроме того, что такое характеристики для get_authentication_info()?

+0

Это демонстрационный код ... комментарии просто показывают, где я пытался установить хэш% ENV. – telesphore4

+1

Настройка '$ ENV {HTTP_WWW_AUTHENTICATE}' срабатывала только при попытке, вы должны делать что-то еще неправильно. –

+0

@ telesphore4: Ну, не оставляйте прокомментированный код. Опубликуйте код, который вы на самом деле пытаетесь запустить, вместо того, чтобы полагаться на способность других, чтобы вывести то, что вы или не делаете. Если бы я должен был догадаться, я бы сказал, что проблема заключается в 'get_authentication_info()'. –

4

Как сказал Синан, строки $ENV{...} прокомментированы, поэтому он не может работать. Но если вы хотите действительно тестируемый код, я бы предложил сделать функцию get_authentication_info хэшем в качестве аргумента. Таким образом, вы можете протестировать его, не устанавливая глобальную переменную, а в реальном коде вы можете передать реальный хеш-энвирунт. В конечном итоге глобальное государство всегда будет проблемой.

+0

Как я уже сказал, это устаревший код, так что это будет проблемой по всему – telesphore4

+1

Пока это устаревший код под вашим контролем, вы всегда можете его реорганизовать. –

+0

Правда, но я пытаюсь выполнить «тесты перед изменениями». TDD вещь – telesphore4

2

Согласовано с Lukáš - получите свою глобальную среду (и выполните проверки на достоверность и т. Д.) Все в одном месте, например, в своем собственном методе, а затем передайте эти значения ко всем другим методам, которые в ней нуждаются. Таким образом, в ваших модульных тестах вы можете просто заменить метод замены, который определяет переменные среды и конфигурации другим способом (например, из файла или непосредственно установленным в верхней части тестового скрипта).

+0

Это устаревший код – telesphore4

1

Попробуйте установить переменную env перед BEGIN.

Если бы не попробовать это:

  1. Во-первых, перейдите в командную строку и установить ENV вар там. Затем запустите свой скрипт. Если тесты пройдут. Затем, как вы и предполагали, проблема заключается в установке env var.

  2. Если тесты не пройдены, проблема возникает где-то еще (возможно, в get_authentication_info).

+0

Я пробовал буквальный «перед блоком BEGIN». Неплохо. Perl выполняет блок BEGIN перед чем-то еще ... так, где бы я это точно поставил. – telesphore4

+0

Да, BEGIN выполняется перед другим кодом, но я предполагал, что, возможно, он выполнен в другом контексте, поэтому env var не выживает после выполнения BEGIN. Но, очевидно, я ошибся. :) Я добавил простой план тестирования кода. Пробовал? – Thushan