重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

php单测mock数据库 php测试数据库连接

如何使用Mock来测试Files,Database和ContentProviders

首个先我们创建一个应用,功能很简单就是读取该应用目录下的一个txt文件内容,并展示到应用的activity上。

十余年的东兴网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整东兴建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“东兴网站设计”,“东兴网站推广”以来,每个客户项目都认真落实执行。

public class MockContextExampleActivity extends Activity {

public final static String FILE_NAME = “myfile.txt”;

private TextView mTv;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mTv = (TextView) findViewById(R.id.TextView01);

final byte[] buffer = new byte[1024];

try {

final FileInputStream fis = openFileInput(FILE_NAME);

final int n = fis.read(buffer);

mTv.setText(new String(buffer, 0, n-1));

} catch (Exception e) {

mTv.setText(e.toString());

mTv.setTextColor(Color.RED);

}

}

//这里写了个getText方法,测试工程会用到。

public String getText() {

return mTv.getText().toString();

}

运行一下,此时我们的包目录下没有myfile.txt,页面显示的可能是个错误。OK,然后我们创建两个文件。一个名为myfile.txt,一个test.myfile.txt。前者用于应用中显示的文件内容,后者是作为测试Mock调用的。

echo “This is real data” data/data/com.example.aatg.mockcontextexample/files/myfile.txt

echo “This is *MOCK* data” data/data/com.example.aatg.mockcontextexample/files/test.myfile.txt

再次运行下,应该可以看到Activity上显示的是This is real data。

OK,下面开始编写测试代码。我们的目的是测试这个app能够正确读取文件,假设现在我怕是不是开发在代码里写死了“This is real data”这句话(作为测试,有点怀疑精神很正常)。OK,现在我用另外一个文件test.myfile.txt来代替myfile.txt会不会出错。

public class MockContextExampleTest extends ActivityUnitTestCaseMockContextExampleActivity {

private static final String PREFIX = “test.”;

private RenamingDelegatingContext mMockContext;

public MockContextExampleTest() {

super(MockContextExampleActivity.class);

}

@Override

protected void setUp() throws Exception {

super.setUp();

mMockContext = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), PREFIX);

mMockContext.makeExistingFilesAndDbsAccessible();

}

@Override

protected void tearDown() throws Exception {

super.tearDown();

}

public void testSampleTextDisplayed(){

setActivityContext(mMockContext);

startActivity(new Intent(), null, null);

final MockContextExampleActivity mActivity = getActivity();

assertNotNull(mActivity);

String text = mActivity.getText();

assertEquals(“This is *MOCK* data”, text);

}

}

主要看下RenamingDelegatingContext函数的使用,PREFIX是表示文件或数据库的前缀。另外这里为什么使用getTargetContext方法而不是getContext,后者我们经常在UiTest中使用到。这里其实看下注释就明白了:

//getContext():The instrumentation’s package context.

//getTargetContext(): A Context in the target application.

运行下测试,pass。这说明getText方法返回的string已经是This is *MOCK* data 而不是 This is real data了。这我就可以证明,开发没有写死这段话。以上就是RenamingDelegatingContext函数如何来mock文件的,数据库的使用也是一样的。

如何在phpunit中mock一个单例类

当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。Phpunit中提供了一套模拟类的api,简单使用如下:

[php] view

plaincopyprint?

class StubTest extends PHPUnit_Framework_TestCase

{

public function testStub()

{

// Create a stub for the SomeClass class.

$stub = $this-getMock('SomeClass');

// Configure the stub.

$stub-expects($this-any())

-method('doSomething')

-will($this-returnValue('foo'));

// Calling $stub-doSomething() will now return

// 'foo'.

$this-assertEquals('foo', $stub-doSomething());

}

}

class StubTest extends PHPUnit_Framework_TestCase

{

public function testStub()

{

// Create a stub for the SomeClass class.

$stub = $this-getMock('SomeClass');

// Configure the stub.

$stub-expects($this-any())

-method('doSomething')

-will($this-returnValue('foo'));

// Calling $stub-doSomething() will now return

// 'foo'.

$this-assertEquals('foo', $stub-doSomething());

}

}

在这个例子中,我们得到了一个'SomeClass'的模拟,规定其可以被调用任意次,如果调用doSomething方法,将得到值foo。

问题:

我们知道,对于一个单例类,其constructor方法为private,而getMock的实现,默认是要调用原类的constructor方法。

如果SomeClass为单例,phpunit将会提示

Call to private SomeClass::__construct() from context 'PHPUnit_Framework_TestCase'

这时,我们的测试该如何进行呢?

解决:

仍然使用getMock进行模拟。

只要将其第5个参数设为false即可。其含意是:不调用原对象的构造函数。

[php] view

plaincopyprint?

$stub = $this-getMock('SomeClass', array(), array(), '', false);

$stub = $this-getMock('SomeClass', array(), array(), '', false);

不得不说,这样使用有点复杂。

如果你使用的是phpunit3.5及以上版本提供了更易用的api,你可以这样禁掉对原有constructor方法的调用。

$stub=$this-getMockBuilder('SomeClass')-disableOriginalConstructor()-getMock();

附:

对getMock的6个可选参数的详解,

手册中并未提及它们的默认值,经测试得到结果如下:

array(), array(), '', false, false, false

$stub=$this-getMockBuilder('SomeClass')

等同于:

$stub=$this-getMockBuilder('SomeClass',array(), array(), '', true, false, false)

php单元测试怎么写

写过JAVA和C++的单元测试,PHP,没必要也没写过。单元测试主要是对核心的类和方法进行测试,在J2EE开发中,由于各种配置比较繁琐,并且是分层开发,所以很有必要写单元测试。比如,我做了一个service,我就可以针对这个service写个单元测试,取出这个bean,来验证是否正常,而不必等到ACTION层写好后,配置完整再来测试。对J2EE来说,service正常后,ACTION我就不用管了。做单元测试也容易提早发现问题。并且eclipse自带了iunit,使用极其方便。C++也一样,流程比较复杂,为了尽快验证和发现问题,有做单元测试的必要。而PHP这类脚本,不需要。我也很少见人提到过php的单元测试。本身逻辑就不复杂,而且大多数也不分层。NETBEAN自带了phpunit,不过从没用过如果还有不明白的话,你可以在后盾人看看视频找找答案,有空多看看时间长了,慢慢就明白了,希望能帮到你,给个采纳吧谢谢グッ!(๑•̀ㅂ•́)و✧

php网站本地测试数据库怎么连接?

?php

$conn

=

mysql_connect('localhost','root','')

or

die('连接数据库失败,请检查您的数据库配置');

?

mysql_connect第二个参数是用户名,第三个参数

默认情况下,用上面测试下,如果不行就看下面是密码

?php

$conn

=

mysql_connect('localhost','用户名','密码')

or

die('连接数据库失败,请检查您的数据库配置');

?


文章名称:php单测mock数据库 php测试数据库连接
网站URL:http://cqcxhl.com/article/dopcdos.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP