我在使用 Codeception 自动加载器加载一些抽象测试类时遇到问题。抽象类的原因是模仿应用程序中使用的类的结构,以减少彻底测试应用程序所需的代码量。
假设我有一个用于测试的抽象类,比如说“AbstractRepositoryTester”,它仅用于“存储库”测试套件(出于组织目的,我喜欢将它们分开)。
我测试的每个实现“RepositoryContract”的存储库都将有一个测试,该测试还使用一些覆盖的抽象方法扩展“AbstractRepositoryTester”。
现在执行此操作时,抽象类将不会在测试期间加载,必须在 Bootstrap 文件中手动加载。还有另一个抽象扩展了 vanilla Codeception 测试类,这样我就可以设置一些变量(即 laracasts/testdummy)。
如果不手动输入 _boostrap 文件,这两个类将无法加载。除此之外,特定于套件的 Bootstrap 文件无法加载文件或看似根本无法执行,因此我不得不将所有套件的所有 Bootstrap 代码放入全局 _bootstrap 文件中。
我还尝试将 Codeceptions 自动加载类 \Codeception\Util\Autoload:: 与“load”方法一起使用,但它似乎不起作用。
现在我在全局 _bootstrap 中使用 require_once 所以最后的问题是:
是否有自动加载(或仅加载)要用作全局和每个套件测试一部分的类的正确方法?
在像这样抽象我的测试时,我总体上是否走在正确的轨道上? TDD 对我来说是新手,我正在努力改进我的开发工作流程(在 Laracasts 的帮助下)。
我已经在每个地方搜索了一个答案来加载我需要的类,但通常我会找到的是 PHPUnit 特定的答案,这些答案似乎不起作用。我还查看了 Codeception 文档,该文档在该主题上感觉有点稀疏,并且 API 文档没有解释 Autoload::load
干杯,
- 埃弗隆。
最佳答案
您可以对整个测试服或单个组件执行此操作。例如,仅针对单元测试,执行以下操作:
bootstrap: my_bootstrap_file.php 到 tests/unit.suite.yml:# Codeception Test Suite Configuration
#
# Suite for unit or integration tests.
actor: UnitTester
bootstrap: my_bootstrap_file.php
modules:
enabled:
- Asserts
- \Helper\Unit
调用 my_bootstrap_file.php 一些合理的东西,比如 bootstrap.php
tests/unit/my_bootstrap_file.php<?php
\Codeception\Util\Autoload::addNamespace('', 'src');
目录结构应该是这样的:
<project root>
src/
tests/
unit/
my_bootstrap_file.php
unit.suite.yml
将上述说明中的unit替换为acceptance、functional等,以应用于不同的单体组件。
\Codeception\Util\Autoload::addNamespace() 的 PhpDoc:
/**
* Adds a base directory for a namespace prefix.
*
* Example:
*
* ```php
* <?php
* // app\Codeception\UserHelper will be loaded from
* '/path/to/helpers/UserHelper.php'
*
* Autoload::addNamespace('app\Codeception', '/path/to/helpers');
*
* // LoginPage will be loaded from '/path/to/pageobjects/LoginPage.php'
* Autoload::addNamespace('', '/path/to/pageobjects');
*
* Autoload::addNamespace('app\Codeception', '/path/to/controllers');
* ?>
* ```
*
* @param string $prefix The namespace prefix.
* @param string $base_dir A base directory for class files in the namespace.
* @param bool $prepend If true, prepend the base directory to the stack instead
* of appending it; this causes it to be searched
* first rather than last.
* @return void
*/
public static function addNamespace($prefix, $base_dir, $prepend = false)
如果您希望它应用于整个测试套件,而不仅仅是单元测试,请使用 codeception.yml 而不是 tests/unit.suite.yml,并且 tests/my_bootstrap_file.php 而不是 tests/unit/my_bootstrap_file.php。
<project root>
src/
tests/
my_bootstrap_file.php
codeception.yml
关于php - Codeception 自动加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28019717/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
我需要做这样的事情classUser'User',:foreign_key=>'abuser_id'belongs_to:gameendclassGame['JOINabuse_reportsONusers.id=abuse_reports.abuser_id','JOINgamesONgames.id=abuse_reports.game_id'],:group=>'users.id',:select=>'users.*,count(distinctgames.id)ASgame_count,count(abuse_reports.id)asabuse_report_count',:
我指的是pubrailscasttutorial并已正确执行所有步骤,但在运行最后一个命令时,即rackupprivate_pub.ru-sthin-Eproduction为了架设faye服务器,我收到以下错误:/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require':cannotloadsuchfile--thin(LoadError)from/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/var/lib/gems/1.9.1/gems