在Laravel 5.5中测试:类env不存在

时间:2018-02-13 12:06:58

标签: laravel testing integration-testing

我正在laravel开始测试

我用这个

创建了一个“.env.testing”文件
APP_NAME=myApp
APP_ENV=testing
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://myApp.localhost

DB_CONNECTION=sqlite_testing

我在config / database.php文件的“connections”部分添加了这个

...
'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => ':memory:',
    'prefix'   => '',
],
...

在phpunit.xml文件中,我添加了:

<env name="DB_CONNECTION" value="sqlite_testing" />

我创建了一个UserTest功能:

class UserTest extends TestCase
{

    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    public function tearDown()
    {
        parent::tearDown();
        Artisan::call('migrate:reset');
    }


    public function testCanAccessUserSpace()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
            ->get('/home');


        $response->assertStatus(200);
    }
}

但是当我运行测试时,我有这个:

ReflectionException: Class env does not exist

我的配置有什么问题?

感谢

6 个答案:

答案 0 :(得分:4)

运行phpunit时出现相同的错误:

  

ReflectionException:类env不存在

这是另一个问题,我已经安装了软件包 telescope ,而phpunit试图在测试时加载它:

ReflectionException: Class env does not exist
/var/www/html/mat2/vendor/laravel/telescope/src/Telescope.php:263
/var/www/html/mat2/vendor/laravel/telescope/src/Telescope.php:222

,依此类推。 我已添加到phpunit.xml:

<env name="TELESCOPE_ENABLED" value="false"/>

之后,测试运行正常。
因此,可能与包装测试有关。

答案 1 :(得分:0)

您需要将.env.testing重命名为.env,您已将APP_ENV设置为testing,因此无需将.env更改为{{1} }}

修改

还尝试使用.env.testing更新您的依赖项并重试,这不是常见的错误,因此它与您的测试环境设置相关

答案 2 :(得分:0)

由于各种原因,引发此异常。在您的情况下,问题是在该函数内的特定操作顺序下的tearDown函数。您应该在底部调用父对象tearDown。所以这个:

public function tearDown()
{
    parent::tearDown();
    Artisan::call('migrate:reset');
}

应重构如下:

public function tearDown()
{
    Artisan::call('migrate:reset');
    parent::tearDown();
}

我怀疑原因是该应用实例在Illuminate\Foundation\Testing\TestCase内部被破坏了。这是Laravel 5.5中的代码:

if ($this->app) {
    foreach ($this->beforeApplicationDestroyedCallbacks as $callback) {
        call_user_func($callback);
    }

    $this->app->flush();

    $this->app = null;
}

答案 3 :(得分:0)

如果您使用的是class PreferenceUtil { private var msharedPref: SharedPreferences? = null private var mEditor: Editor? = null companion object { private var sInstance: PreferenceUtils? = null fun getInstance(context: Context): PreferenceUtils { if (sInstance == null) { sInstance = PreferenceUtils(context) } return sInstance as PreferenceUtils } } constructor() constructor(mContext: Context?) { msharedPref = mContext?.getSharedPreferences(APP_PREF, MODE_PRIVATE) mEditor = mSettings?.edit() } // get Boolean value fun getValue(key: String, defValue: Boolean): Boolean { return msharedPref!!.getBoolean(key, defValue) } // set Boolean value fun setValue(key: String, value: Boolean) { mEditor!!.putBoolean(key, value) mEditor!!.apply() } ,请将php artisan test --env=testing添加到您的TELESCOPE_ENABLED=false文件中,然后运行.env.testing

答案 4 :(得分:0)

就我而言,将TELESCOPE_ENABLED设置为false不能解决我的问题。我必须发出

php artisan config:clear

我使用Laravel 7。

答案 5 :(得分:0)

此错误可能是由于在单元测试环境中打开望远镜引起的。

我将望远镜的默认行为更改为关闭,然后在我的import pygame import sys import random import math import time pygame.display.set_caption('Snake') pygame.font.init() game_running = True width = 400 height = 400 size = (width, height) window = pygame.display.set_mode(size) # our surface type pygame.display.set_caption("Snake Game by Nick Rinaldi") class Food: def __init__(self, block_size, surface, x_loc, y_loc): # pass in color and random_x/random_y. block size is a constant self.block_size = block_size self.surface = surface # green self.x_loc = x_loc self.y_loc = y_loc self.mask = pygame.mask.from_surface(self.surface) def draw(self, window): window.blit(self.surface, (self.x_loc, self.y_loc)) class Snake: def __init__(self, block_size, surface, x_loc, y_loc): self.block_size = block_size self.surface = surface # red self.x_loc = x_loc self.y_loc = y_loc self.body = [] self.direction = None self.velocity = 20 self.mask = pygame.mask.from_surface(self.surface) def draw(self, color, window, block_size): self.seg = [] self.head = pygame.Rect(self.x_loc, self.y_loc, block_size, block_size) pygame.draw.rect(window, color, self.head) if len(self.body) > 0: for unit in self.body: segment = pygame.Rect(unit[0], unit[1], block_size, block_size) pygame.draw.rect(window, color, segment) self.seg.append(segment) def add_unit(self): if len(self.body) != 0: index = len(self.body) - 1 x = self.body[index][0] y = self.body[index][1] self.body.append([x, y]) else: self.body.append([1000, 1000]) def move(self, step): for index in range(len(self.body) -1, 0, -1): x = self.body[index-1][0] y = self.body[index-1][1] self.body[index] = [x, y] if len(self.body) > 0: self.body[0] = [self.x_loc, self.y_loc] if self.direction == "right": # if specific constant, keep moving in direction self.x_loc += self.velocity * step if self.direction == "left": self.x_loc -= self.velocity * step if self.direction == "down": self.y_loc += self.velocity * step if self.direction == "up": self.y_loc -= self.velocity * step def collision(self, obj): return collide(food) def gameOver(snake): white = pygame.Color(255, 255, 255) display = True while display: window.fill(white) score_font = pygame.font.SysFont("Courier New", 16) score_label = score_font.render("Your score was: " + str(len(snake.body) + 1), 1, (0, 0, 0)) replay_label = score_font.render("To replay, click the mouse button", 1, (0, 0, 0)) window.blit(score_label, (50, 100)) window.blit(replay_label, (50, 130)) pygame.display.update() for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game. if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.MOUSEBUTTONDOWN: main() pygame.quit() sys.exit() clock = pygame.time.Clock() def main(): game_over = False x = 20 # x position y = 20 # y position block_snakes = [] pygame.init() clock = pygame.time.Clock() red = pygame.Color(255, 0, 0) green = pygame.Color(0, 255, 0) white = pygame.Color(255, 255, 255) black = pygame.Color(0, 0, 0) block_size = 20 randx_green = random.randrange(0, width, 20) randy_green = random.randrange(0, height, 20) randx_red = random.randrange(0, width, 20) randy_red = random.randrange(0, height, 20) red_square = pygame.Surface((block_size, block_size)) red_square.fill(red) green_square = pygame.Surface((block_size, block_size)) green_square.fill(green) snake = Snake(block_size, red_square, 20, 20) # create snake instance food = Food(block_size, green_square, randx_green, randy_green) # create food instance def redraw_window(): draw_grid(window, height, width, white) while game_running: dt = clock.tick(30) # time passed between each call step = dt/1000 print(step) FPS = 60 window.fill(black) food.draw(window) snake.draw(red, window, block_size) redraw_window() for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game. if event.type == pygame.QUIT: pygame.quit() exit() keys = pygame.key.get_pressed() if keys[pygame.K_RIGHT]: # sets direction attribute as a constant snake.direction = "right" if keys[pygame.K_LEFT]: snake.direction = "left" if keys[pygame.K_DOWN]: snake.direction = "down" if keys[pygame.K_UP]: snake.direction = "up" snake.move(step) collision = collide_food(snake.x_loc, snake.y_loc, food.x_loc, food.y_loc) if collision: ac_rand_x = random.randrange(0, width, 20) # after collision, random x ac_rand_y = random.randrange(0, height, 20) # after collision, random y # check snake.direction. food = Food(block_size, green_square, ac_rand_x, ac_rand_y) food.draw(window) snake.add_unit() wall_collide = collide_wall(snake.x_loc, snake.y_loc) if wall_collide: gameOver(snake) # break for block in snake.body: if snake.x_loc == block[0] and snake.y_loc == block[1]: gameOver(snake) pygame.display.update() # clock.tick(FPS) def collide_food(snake_x, snake_y, obj_x, obj_y): distance = math.sqrt((math.pow(snake_x - obj_x, 2)) + (math.pow(snake_y - obj_y, 2))) if distance < 20: return True else: return False def collide_wall(snake_x, snake_y): if snake_x > width: game_over = True return game_over if snake_y > height: game_over = True return game_over if snake_x < 0: game_over = True return game_over if snake_y < 0: game_over = True return game_over def collide_self(snake_x, snake_y, body_x, body_y): if (snake_x and snake_y) == (body_x and body_y): return True else: return False def draw_grid(window, height, width, color): x = 0 y = 0 grid_blocks = 20 for i in range(height): x += 20 pygame.draw.line(window, color, (x, 0), (x, height), 1) for j in range(width): y += 20 pygame.draw.line(window, color, (0, y), (height, y), 1) # pygame.display.update() def display_score(): score_font = pygame.font.SysFont() def main_menu(width, height): clock = pygame.time.Clock() FPS = 60 width = width height = height run = True title_font = pygame.font.SysFont("Courier New", 16) title_font.set_bold(True) white = pygame.Color(255, 255, 255) while run: window.fill(white) title_label = title_font.render("Snake Game by Nick Rinaldi ", 1, (0, 0, 0)) sponser_label = title_font.render("Sponsored by @goodproblemsnyc", 1, (0, 0, 0)) window.blit(title_label, ((width/4, height/4))) window.blit(sponser_label, ((width/4, height/4 + 30))) pygame.display.update() for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game. if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.MOUSEBUTTONDOWN: main() pygame.quit() main_menu(width, height)``` 文件中明确将其打开。

您可以通过更新.env文件来将望远镜的默认值更改为false。

config/telescope.php

然后,您必须在.env文件中设置: /* |-------------------------------------------------------------------------- | Telescope Master Switch |-------------------------------------------------------------------------- | | This option may be used to disable all Telescope watchers regardless | of their individual configuration, which simply provides a single | and convenient way to enable or disable Telescope data storage. | */ 'enabled' => env('TELESCOPE_ENABLED', false), // Change from true to false here. 。这样可以确保您不会在不需要的环境(例如生产和单元测试)中意外打开它。