单元测试的编写和维护成本更低,但它们并不涵盖所有场景.他们之间的平衡是什么?
我想向我的功能测试中的不同控制器发出一个发布请求,该控制器用于特定的控制器.但是,ActiveController类中的post方法只是调用方法,它不会调用控制器名称.任何想法如何调用不同的控制器?
我很想知道谁在测试Chrome.
我主要是因为它已成为我的主要浏览器,因此所有开发都在Chrome上进行,然后我使用IE和Firefox进行测试.
我有一个相当复杂的Web应用程序,使用Grails编写.我正在尝试建立一个功能测试框架,最初使用Selenium,但遇到了两个问题.
我想测试的页面的一部分涉及使用jstree显示的树状数据结构.这里的问题是我希望模拟的动作 - 用户点击节点以显示其子节点 - 似乎是通过点击div中的特定坐标来触发的,这证明很难测试.我已经设法通过使用Selenium的executeScript()方法直接传递给浏览器的Javascript打开这个节点来解决这个问题.
webapp大量使用文件上传,这是我绝对需要测试的东西.使用Selenium提交文件上传没有直接的方法.
解决这个问题的最佳方式是什么?我正在考虑尝试Tellurium(但是从我的阅读中不清楚文件上传是否有效)或iMacros(假设浏览器扩展将更好地处理文件上传).这不是我所处的罕见情况; 任何人都可以提出更好的选择吗?
我目前正在努力保持我的控制器规格DRY和简洁,并在每个示例下降为一个断言.我遇到了一些困难,特别是在嵌套的结构中将实际的控制器请求调用放在哪里以匹配各种边缘情况.
这是一个示例,简化为演示问题:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Run Code Online (Sandbox Code Playgroud)
显然这是一个人为的例子,但它说明了我想做什么和什么不行.主要是,before"未发布"上下文中的块是问题所在.由于上下文嵌套的方式,我在调用后实际发生的设置数据的变化会发生什么变化get,因此该上下文中的示例实际上是使用初始场景而不是我想要的场景.
我理解为什么会发生这种情况以及上下文如何嵌套.我想我会喜欢有一些方法来告诉RSpec的想什么,我就向右运行后,任何before尚未右勾拳之前给定的范围内的任何断言.这对控制器规格来说是完美的.我想利用我的控制器规范中的嵌套来逐渐构建边缘情况的变体,而不必将get调用分散,甚至do_get在我的每个it断言中调用助手.这与it_should我正在使用的任何自定义宏保持同步尤其令人讨厌.
目前RSpec还有什么可以实现这一目标吗?有什么技巧可以用来接近吗?它看起来非常适合我看到很多人编写控制器规格的方式; 根据我的发现,人们基本上已经决定do_get在每次断言之前都要求帮助者.有没有更好的办法?
我有一个使用子域路由到代理商的应用程序:
foo.domain.dev -> Agency:showAction(foo)
bar.domain.dev -> Agency:showAction(bar)
domain.dev -> Agency:indexAction()
Run Code Online (Sandbox Code Playgroud)
这些都对应于代理实体和控制器.
我有一个监听器,它监听onDomainParse事件并将子域写入请求属性.
/**
* Listens for on domainParse event
* Writes to request attributes
*/
class SubdomainListener {
public function onDomainParse(Event $event)
{
$request = $event->getRequest();
$session = $request->getSession();
// Split the host name into tokens
$tokens = $this->tokenizeHost($request->getHost());
if (isset($tokens['subdomain'])){
$request->attributes->set('_subdomain',$tokens['subdomain']);
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
然后我在控制器中使用它来重新路由到show动作:
class AgencyController extends Controller
{
/**
* Lists all Agency entities.
*
*/
public function indexAction()
{
// We reroute to show action …Run Code Online (Sandbox Code Playgroud) 我们有一个使用UI路由器构建的应用程序,其中包含一些路由解析.我们试图对它运行一些量角器测试,但似乎默认的browser.get()不等待ui路由器完全解析
这是我们的简单测试
describe('coach pages', function() {
beforeEach(function() {
browser.get("/");
});
it('should have the right title', function() {
expect(browser.getTitle()).toBe('The Title');
});
it('should have a heading', function() {
expect(element(by.css('#test')).isPresent()).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
第一个通过,它找到页面标题,但标题不是
如果我们加上这个
browser.sleep(1000);
就在第二个期望它通过之前?
量角器是否应该等待结果默认完成?是与UI路由器的某种冲突?
值得补充的是,任何没有解决它的路线似乎都按预期等待它,它只影响附加了解决方案的路线?
我的应用程序中有三个活动
我想使用espresso来测试一系列事件:单击登录活动上的登录按钮,打开主活动,然后单击主活动中的列表项,打开详细活动,然后单击详细信息中的另一个按钮活动.我开始创建这个简单的测试,以获得对listview的引用:
public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
public LoginActivityTest() {
super(LoginActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testSequence() throws Exception {
// Login
onView(withId(R.id.button_log_in)).perform(click());
// Check if MainActivity is loaded
onView(withId(R.id.container)).check(matches(isDisplayed()));
// Check if Fragment is loaded
onView(withId(R.id.list)).check(matches(isDisplayed()));
}
}
Run Code Online (Sandbox Code Playgroud)
在mainActivity onCreate()方法中,我加载一个像这样的片段:
getFragmentManager().beginTransaction()
.add(R.id.container, mListFragment)
.commit();
Run Code Online (Sandbox Code Playgroud)
该ListFragment片段有一个列表(R.id.list),但仍是测试失败了NoMatchingViewException:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.tests.android.development:id/list
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
java android functional-testing android-fragments android-espresso
我有一个Commandbus处理程序,它注入了一些服务:
class SomeHandler
{
private $service;
public function __construct(SomeService $service)
{
$this->service = $service;
}
public test(CommandTest $command)
{
$this->service->doSomeStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
SomeService的方法doSomeStuff具有外部调用,我不想在测试期间使用它。
class SomeService
{
private $someBindedVariable;
public function __construct($someBindedVariable)
{
$this->someBindedVariable = $someBindedVariable;
}
public function doSomeStuff()
{
//TODO: some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在测试中,我尝试用模拟对象替换服务
public function testTest()
{
$someService = $this->getMockBuilder(SomeService::class)->getMock();
$this->getContainer()->set(SomeService::class, $someService);
//TODO: functional test for the route, which uses SomeHandler
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是该代码将引发异常““ App \ Service \ SomeService”服务是私有的,您无法替换它。”
好的,让我们尝试将其公开:
services.yaml:
App\Service\SomeService:
public: true
arguments:
$someBindedVariable: 200
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。我从本地SomeService得到响应。让我们尝试使用别名: …