有没有办法用PHPUnit创建一个mock类,然后我可以使用它的类名创建一个新的实例?
我有一个定义两种方法的接口.就像是:
interface FooInterface {
function getA();
function getB();
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个接受类名的类,创建该类的实例,检查它是否是它所期望的实例(FooInterface),然后在该类上调用两个方法来获取一些信息.
class FooInfo {
protected $a;
protected $b;
public function __construct($fooClass) {
$foo = new $fooClass;
if (!($foo instanceof FooInterface)) {
throw new \Exception();
}
$this->a = $foo->getA();
$this->b = $foo->getB();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何模拟一个对象就好了.问题是,因为这个类接受一个类名,而不是一个对象(它是一个Manager的一部分,根据需要创建给定类的实例),我不能使用普通的模拟对象.
我试着制作一个模拟对象,然后使用该类名.它似乎创造了对象很好,甚至似乎有我嘲笑的功能.但是,它似乎没有遵循我稍后设置的will($ this-> returnValue('myValue'))部分.
public function testConstruct()
{
$foo = $this->getMockForAbstractClass('Foo', array('getA', 'getB'));
$foo->expects($this->any())->method->('getA')->will($this->returnValue('a'));
$foo->expects($this->any())->method->('getB')->will($this->returnValue('b'));
$copyClass = get_class($foo);
$copy = new $copyClass();
// Passes
$this->assertTrue(method_exists($copy, 'getA');
// Fails, $copy->getA() returns null.
$this->assertEquals($copy->getA(), $foo->getA());
}
Run Code Online (Sandbox Code Playgroud)
因此,它确实具有被模拟的函数,但它们都返回null.
有任何想法吗?
我希望以列名的第一部分是字符串的方式连接列名,第二部分是另一个查询的结果的数字.
例如:
SELECT CONCAT('column', mytable.mycolumn) FROM table ...
Run Code Online (Sandbox Code Playgroud)
这可以通过某种方式完成.这样它不会给我错误,但我没有得到预期的结果,似乎连接不起作用.
如果这个问题已经讨论过,我很抱歉,但我并没有真正找到我想要的东西.我面临的问题更多是关于模式和设计选择而不是.NET本身.我想建议你知道从哪里开始我的重构.
今天我在我的实际应用程序中打开了一个类,发现它有13个由构造函数注入的依赖项!实际上,每个开发人员都在他正在编写的方法中添加了所需的依赖性.
我对DI的理解之一是,当我们通过构造函数注入依赖项时,它意味着它是一个强制依赖项,应该在类的所有方法中使用.如果我们只需要给定类的一个方法中的特定依赖项,它对您意味着什么?
找到合适的平衡点很困难.实际上,有时候不可能以干净的方式封装bahaviour.
我正在考虑创建像服务聚合器这样的东西来隐藏其中一个相关的依赖关系,但是如果你有其他建议的话.提前致谢.
我正在编写第一个使用OAuth的应用程序.这适用于桌面应用程序,而不是访问二进制文件的网站或移动设备,因此我担心如何保护我的应用程序密钥和密钥.我觉得查看编译文件并找到存储密钥的字符串是微不足道的.
我是否过度反应或者这是桌面应用程序的真正问题(使用已知解决方案)?
这个项目是用Java编写的,但我也是一个C#开发人员,所以任何.NET解决方案都会受到赞赏.
编辑:我知道没有完美的解决方案,我只是在寻找缓解解决方案.
编辑2:我知道只有解决方案是使用某种形式的混淆.是否有任何免费的.NET和Java提供程序可以进行字符串混淆?
我目前正在使用md5函数来加密我的密码并保存到无法解密的mysql数据库.
现在我的用户希望当他们忘记密码时,他们应该获得相同(旧)密码而不是新密码.
所以我的问题是我应该用什么来加密我的密码并存储在mysql数据库中.我也可以解密该密码.
我在php和mysql上运行.
谢谢
阿维纳什
我的Eclipse项目中有一些UTF-8 HTML模板,Eclipse一直将它们视为具有不同的编码.它说编码是"根据内容确定的".我想强制正确的编码.
我可以强制它为一个文件,但设置父文件夹的编码不会影响其中的文件,因为而不是属性表中的"继承"选项,它是"确定内容"的东西.
是否可以一次为项目中的所有文件设置编码?
Zend Framework 2中的Session组件的体系结构尚未记录,我在理解它的实际应用时遇到了一些麻烦(例如,与非常直观的Symfony Session相比).
重要部分的简短摘要:
Zend\Session\Storage\SessionStorage映射并替换$_SESSION超全局Zend\Session\SessionManager 是一个管理存储,会话cookie,会话配置,会话验证等的外观.Zend\Session\Container是旧的Session_Namespace,不同的容器共享一个Manager实例(通过静态字段)的替代品.没有代表名称空间(容器)集合的组件,因此无法使用'issetNamespaceX','unsetNamespaceX'等方法.没有人(包括Manager和Storage)知道容器,是否存在是什么,如果,有多少名称.
Matthew Weier O'Phinney解释了这种情况如下:
Container是一个特殊类,用于处理当前Storage实例的独立段.[...]如果有的话,存储适配器将包含容器,而不是管理器.但是,我们还希望允许更多基本的存储使用,这使得Container与存储正交,这解释了has-a关系的差异.
关于正确的依赖注入,我看到了这个解决方案的一些实际问题.显然,管理器可以被视为具有相当长寿命的服务,因此有资格进行构造函数注入.不幸的是,管理器没有关于容器的任何线索,这也迫使我注入容器(坏因为相当短暂并且需要插槽),编写我自己的附加功能以使存储或管理器容器感知(应该是框架)功能)或在我的消费类中创建容器(我想明显避免).
所以Zend解决方案对我来说似乎并不实用.如果我想使用Manager,FlashMessenger和一个额外的容器,我需要注入4(四个!)类.如果我对Symfony Session做同样的事情,我只需要注入1(一)个类.
此外,容器不符合注入条件,因为它们可能是短暂的运行时对象,在脚本执行期间可能存在或可能不存在.使用Symfony Session这不是问题,因为Session知道它的包(容器),ZF2这是一个问题,因为Manager不知道容器.
主要问题:我如何在实践中使用Zend\Session with Containers?
附加问题:是否有充分的理由不提供类似于ZF1的真实命名空间功能,或者类似于Symfony SessionBag?
我今天有一个奇怪的错误(烦我).涉及三个继承级别:
爷爷:
abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess,
IteratorAggregate
{
protected $_data = array();
/* snip */
}
Run Code Online (Sandbox Code Playgroud)
妈妈:
namespace Survey\Db\Table\Row;
class AbstractRow extends \Zend_Db_Table_Row_Abstract
{
/* snip */
}
Run Code Online (Sandbox Code Playgroud)
孩子:
namespace Survey\Db\Table\Row;
class SurveyItem extends AbstractRow implements ISkippable
{
/* snip */
}
Run Code Online (Sandbox Code Playgroud)
例外:
Type: ErrorException
Value: Undefined property: Survey\Db\Table\Row\SurveyItem::$_data
Location: [...]/Zend/Db/Table/Row/Abstract.php in handleError , line 177
Run Code Online (Sandbox Code Playgroud)
第177行似乎并不相关,但我添加它只是为了让你相信我;)
if (!array_key_exists($columnName, $this->_data)) {
Run Code Online (Sandbox Code Playgroud)
PHP 5.4.11,PHP 5.4.8中不存在问题
当我看到针对Bug#63462的魔法方法的修复因为未设置的保护属性而被调用两次时,我想,这将解决问题,因为这个错误导致了我所看到的奇怪的意外结果.
但事实证明,更新到PHP 5.4.12之后问题仍然存在.PHP中存在另一个类似错误的可能性似乎很高. …
我目前正在使用服务定位器重构基于Zend Framework的PHP库(构造函数)依赖注入(DI).我觉得它改进了我的代码很多,但我不确定是否应该注入所有依赖项.对于使用很多且非特定的依赖项,服务定位器似乎更容易.我有以下依赖项,我仍然使用服务定位器访问:
如果我注入了这些依赖项,它们会使我的构造函数混乱并分散特定的依赖关系.为了测试,我可以在运行测试之前在我的服务定位器中设置这些依赖项.我的实用主义者说我做得很好,但纯粹主义者说我应该一直用DI.
你会推荐DI用于这些类型的物体吗?
在使用webfonts之前,字体是否可以被压缩?我有一个150kB的字体文件.是否可以压缩它.
此外,如果我呼吁两种字体.eot,.ttf并将由浏览器下载?