小编Bri*_*dig的帖子

在phpunit中创建模拟而不模拟任何方法?

当我使用PHPUnit对我的PHP代码进行单元测试时,我试图找出模拟对象的正确方法,而不是模仿它的任何方法.

问题是,如果我不调用getMockBuilder()->setMethods(),那么对象上的所有方法都将被模拟,我无法调用我想要测试的方法; 但如果我打电话setMethods(),然后我需要告诉它嘲笑什么方法,但我不希望在所有的嘲笑任何方法.但我需要创建模拟,这样我就可以避免在测试中调用构造函数.

这是我想要测试的方法的一个简单示例:

class Foobar
{
    public function __construct()
    {
        // stuff happens here ...
    }

    public function myMethod($s)
    {
        // I want to test this
        return (strlen($s) > 3);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可能测试myMethod():

$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)

但这会叫Foobar的构造函数,这是我不想要的.所以相反,我会尝试:

$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)

但是getMockBuilder()不使用调用setMethods()将导致其所有方法被模拟并返回null,因此我的调用myMethod()将返回null而不触及我打算测试的代码.

到目前为止我的解决方法是:

$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
    ->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Run Code Online (Sandbox Code Playgroud)

这将模拟名为'none'的方法,该方法不存在,但PHPUnit并不关心.它会让myMethod()取消模拟,以便我可以调用它,它也会让我禁用构造函数,这样我就不会调用它.完善!除了必须指定一个不存在的方法名称 - "无",或"blargh"或"xyzzy"之外,似乎在作弊.

这样做的正确方法是什么?

phpunit mocking

36
推荐指数
1
解决办法
2万
查看次数

与PHP_CodeSniffer一起使用的标准是什么?

我的代码库遵循(或应该)Zend Coding Standard.我一直在使用Zend标准和PHP_CodeSniffer,但我看到讨论说phpcs的Zend标准不一致且没有维护,并且不一定坚持Zend Coding Standard.所以我正在寻找一种更加一致,最新和广泛使用的标准.我该怎么用?

我听说过"Squiz","PEAR"和"PSR2",但我对它们一无所知.它们之间有什么区别?

php codesniffer

13
推荐指数
1
解决办法
3068
查看次数

什么相当于迦太基的"发展豆荚"?

为我们的iOS应用程序开发框架的团队正在从Cocoapods迁移到Carthage.

在Cocoapods下,我可以将依赖关系设置为"开发窗格".例如,我没有让主应用程序下载特定版本的xyzzy依赖项,而是将其设置xyzzy为开发窗格并将其指向我xyzzy从其Git仓库检出的本地目录.当我在主应用程序的项目中工作时,我对xyzzy文件所做的任何编辑都将在该目录中进行.这让我可以立即构建和测试更改,当我准备好检查它们时,Git会在xyzzy项目目录中找到它们.

在迦太基之下,我还没有办法做到这一点.我看到了http://allocinit.io/ios/debugging-carthage-dependencies/,它解释了如何创建符号链接,以便我可以看到依赖源文件,使调试更容易,但我对它们进行的任何编辑都在主要应用程序的Carthage/Builds目录.

如何在Carthage下设置等效的开发盒?

ios cocoapods carthage

9
推荐指数
1
解决办法
1548
查看次数

一个ASP.NET MVC验证器,用于确保至少选中一个复选框

我有一个ASP.NET MVC 2项目,我在其中创建了一个数据传输对象,用于从网页表单接收数据.表单上有两组复选框.我想验证对象以确保每个组中至少有一个复选框被选中.

我正在服务器端进行验证,以便用户无法破解任何客户端验证.(我稍后会用jQuery添加客户端验证;这很容易.)

我的理解是,我要创建自己的自定义ValidationAttribute我的数据传输对象类,但我不知道如何创建和使用一个可以接受的复选框的任意属性列表,以确保其中至少有一个是真正.我猜我必须调用这样的属性:

[AtLeastOneCheckbox("set1check1", "set1check2", "set1check3",
    ErrorMessage = "You must check at least one checkbox in set 1.")]
[AtLeastOneCheckbox("set2check1", "set2check2", "set2check3", "set2check4", "set2check5",
    ErrorMessage = "You must check at least one checkbox in set 2.")]
public class MyFormDTO
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

AtLeastOneCheckboxAttribute的实现是什么样的?

或者我是否应该采用不同的方式进行此类验证?

validation asp.net-mvc dto asp.net-mvc-2

7
推荐指数
1
解决办法
9939
查看次数

为什么PHPUnit会显示一些大括号而不被覆盖?

我正在使用PHPUnit 3.6.7,PHP_CodeCoverage 1.1.1和Xdebug 2.1.2。当我让PHPUnit将我的代码覆盖率统计信息写入三叶草样式的XML文件时,它偶尔会显示出一个粗斜体,因为没有被测试覆盖。

我在网上看到很多关于PHPUnit何时“到达”花括号的讨论,但是我不了解发生了什么的一般概念。例如,我在一行上的覆盖范围为零:

if (is_array($foo)) {
    foreach ($foo as $bar) {
        if (property_exists($bar, 'baz')) {
            return $bar;
        }
    }
}  // this line has 0 coverage
return null;
Run Code Online (Sandbox Code Playgroud)

和这里:

class Foo
{
    public $myProperty;
    public function myMethod()
    {
        $this->myProperty = '1';
    }
}  // this line has 0 coverage
Run Code Online (Sandbox Code Playgroud)

我项目中的其他类都没有这个问题。它们的大括号根本不会显示在XML文件中,因此它们没有被列为零覆盖率。

我知道PHP_CodeCoverage 1.1.2(尚未发布)会让我在花括号后加上“ // @codeCoverageIgnore”注释,但是在此之前,我想知道正在发生什么,以便可以修复测试给我完整的报道。告诉我何时将花括号算作“被遮盖”或“未被遮盖”的拇指法则是什么?

php phpunit code-coverage xdebug

6
推荐指数
1
解决办法
3175
查看次数

一个自动生成PHPUnit测试的工具?

我想知道 - 有没有一个工具可以查看我的PHP代码并自动为它生成一个PHPUnit测试?或者是否有任何其他语言的工具,我可能能够移植到PHP?

我不是在谈论生成骨架.我认为工具可以查看标记化的PHP并通过方法确定代码路径,然后自动为每个代码路径生成测试,创建模拟并根据需要设置"期望"调用.

即使目前没有工具,也许这样的任务是可行的还是我忽略了什么?

php phpunit

6
推荐指数
1
解决办法
6634
查看次数

iOS 用户无法将辅助功能焦点移至屏幕外的表格单元格(表格可见区域之外)?

在我的 iOS 应用程序中,我有一个 UITableView。它包含一些 UITableViewCellsisAccessibilityElement = true和一些isAccessibilityElement = false. (后者是仅包含分隔线的单元格;我不希望 VoiceOver 读取这些单元格。)

= false如果表格可见区域底部有一个不可访问的单元格 ( ),那么我无法“滑过”它来访问该单元格之外的可访问的表格单元格。相反,向右滑动会将辅助功能焦点从可见的表格单元格移动到其他一些可见的 UI 元素。同样,如果表格可见区域顶部有一个不可访问的单元格,那么我无法向左“滑过”它来访问其上方的可访问单元格。

我希望能够向左和向右滑动浏览表格中所有可访问的单元格,并让它们在获得焦点时滚动到视图中。我尝试覆盖accessibilityElementDidBecomeFocused,希望然后使用scrollToItem,但看起来它永远不会获得焦点,所以它永远不会被调用。

有什么方法可以让 iOS 依次将焦点发送到每个可访问的表格元素,无论它当前是否在视图中?或者是否有一些准则规定可访问性应该只处理当前可见的 UI 元素?

accessibility uitableview ios voiceover swift

6
推荐指数
1
解决办法
1099
查看次数

Xcode 10.1上的“错误:IRGen无法表达,没有其他错误”的解决方案是什么?

我们有一个很大的项目,其中有很多通过Carthage引入的依赖项。每当我们尝试在lldb调试器(p variablename)中查看变量时,都会给我们一个错误:error: Couldn't IRGen expression, no additional error

所有解决方法都不是很好。我们可以使用迦太基--no-use-binaries来绕过它,但是它会使构建花费的时间过长。我们可以使用fr v某些变量,但不能全部使用。人们已经通过更改某些Swift目录的权限在Xcode的早期版本中解决了此问题,但是我在Xcode 10.1中找不到相应的目录。我看到有人说来回更改构建系统对他有所帮助,但这对我们没有用。

因此,我将开始在Xcode 10.1上专门搜索解决方案。是否有其他人发现导致此错误的原因,和/或对此问题有好的解决方案?

xcode lldb swift carthage

5
推荐指数
3
解决办法
1158
查看次数

如何安装PHPUnit 3.5而不是3.6?

当前版本的PHPUnit是3.6,但在我更新代码之前,我需要使用3.5.15代替.我在尝试安装3.5.15时遇到了很多麻烦.

我从一个干净安装的Zend Server开始,它只安装了一些基本的PEAR包.我通道发现了pear.phpunit.de和pear.symfony-project.com.然后我尝试从URL安装3.5.15,但它失败了:

# pear install http://pear.phpunit.de/get/PHPUnit-3.5.15.tgz
downloading PHPUnit-3.5.15.tgz ...
Duplicate package channel://pear.phpunit.de/PHPUnit-3.5.15 found
Duplicate package channel://pear.phpunit.de/PHPUnit-3.6.0 found
install failed
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试从下载的文件安装,但也失败了:

# pear install ~/Desktop/PHPUnit-3.5.15.tgz 
Duplicate package channel://pear.phpunit.de/PHPUnit-3.5.15 found
Duplicate package channel://pear.phpunit.de/PHPUnit-3.6.0 found
install failed
Run Code Online (Sandbox Code Playgroud)

然后从PEAR直接...安装3.6而不是我要求的!

# pear install phpunit/PHPUnit-3.5.15
phpunit/PHPUnit can optionally use package "pear/XML_RPC2"
phpunit/PHPUnit can optionally use PHP extension "dbus"
phpunit/DbUnit requires package "phpunit/PHPUnit" (version >= 3.6.0), downloaded version is 3.5.15
phpunit/PHPUnit requires package "phpunit/DbUnit" (version >= 1.0.0)
phpunit/PHPUnit can optionally use package "phpunit/PHP_Invoker" (version >= 1.0.0) …
Run Code Online (Sandbox Code Playgroud)

pear phpunit

4
推荐指数
1
解决办法
5896
查看次数

如何在 Xcode 中打开优化?

我在 Xcode 7.2 中有一些运行良好的 Swift 代码,但是当我从命令行运行swift -O main.swift以运行它的优化构建时,我的代码运行得非常快。

如何在 Xcode 中开启代码优化?我已经尝试过 Product -> Build For -> Running,但这并没有以优化的速度运行它。我在“启用优化”或“发布版本”的项目设置中没有看到任何内容。

optimization xcode build swift

2
推荐指数
1
解决办法
6014
查看次数

Web服务调用顺序图的好示例?

我被要求制作一个序列图来记录我的应用程序进行的Web服务调用。

我不太了解顺序图。它们很难阅读-很多行,而不是很多文本。例如,如果我想表明我的应用程序对特定服务进行了调用,传递了一组数据并取回了另一组数据,则线路上没有足够的空间,而线路上却没有足够的空间来显示所有这些数据并指出它是GET或POST,并且如果没有此信息,该图将变得非常简单,以至于它不是很有用。我发现在文本文件或Wiki中记录这样的内容要容易得多。但是我看到了序列图的流行程度,所以我认为我没有“得到”它们。

所以我现在有三个问题:

(1)有人可以向我展示一些特别好的/有用的Web服务调用时序图示例,以便让我知道如何正确执行吗?

(2)当流程具有不同的逻辑路径而导致不同的Web服务调用时,我应该在单个序列图中用if / then / else表示这些逻辑路径,还是为每种可能性创建不同的序列图?

(3)我知道序列图是基于UML的,但是UML以什么方式是“语言”呢?没有文字表示,对不对?似乎更多的是一种图示方法,例如流程图。

uml sequence-diagram

2
推荐指数
1
解决办法
3183
查看次数