1

单元测试在开发过程中很重要。但是,测试一些代码并不容易。

如果我有这样的代码:

class Filesystem():

    def destroy(self, fs):
        os.system("mkfs.ext4 %s" % fs)
        #assert(self.size(fs) == 0)

我无法销毁文件系统进行测试。

对于这种情况,我可以在 UNIX 上创建一个基于文件的驱动器进行测试。

但是,如果它是一个 API 类:

class Blog():

    def post(self, text):
        blog.library.post(self.access_key, text)

我不想为测试发布博客文章。

我应该怎么办?

4

4 回答 4

4

对于单元测试:

你的类不应该直接交互,blog.library而是通过你作为Blog类依赖注入的一些中间层进行交互。对于测试,您为它创建一个模拟并断言使用预期参数调用了预期的方法。

对于功能/集成测试:

您设置了一个虚拟博客引擎并执行真实的帖子。然后检查该帖子是否真的出现在带有http请求的页面上。

于 2013-06-21T04:40:46.773 回答
3

不是专家,但我相信嘲笑是答案。

你不想发布一篇文章,实际上你的测试代码根本不期望一篇真实的文章,你只需要伪造一个对象(我们称之为:模拟)并让它表现得像一篇真实的文章,这样你的真实代码就能完成它的工作,这就足够了。

请记住,测试的目的是确保您的代码正常工作。在 OO 编程中,我们将一切都视为对象,因此当您发布文章时,它实际上创建了一个对象,该对象代表了现实世界中的真实文章。模拟一个假对象就足以表达你的代码的行为,所以你根本不需要写一篇真正的文章,只是为了证明你的代码会创建一个可能是一篇文章的对象就足够了。

于 2013-06-21T04:42:07.920 回答
1

正如其他人所说,嘲讽将在这里帮助您。有许多可用的模拟框架 - 我更喜欢 Mockito,因为它看起来最直观(无论如何对我来说)

我发现这篇文章非常快速而清晰地涵盖了基础知识

Mockito 不能模拟静态方法,但可以与 PowerMock 一起使用来实现这一点。一般来说,网络上有很多关于如何做到这一点的例子(尤其是 SO)。话虽如此,我总觉得不得不依赖 PowerMock 通常指向我的代码中的某些问题。

编辑

刚刚意识到我是从 Java 的角度说的,这似乎不是您当前的环境

结束编辑

于 2013-06-21T04:49:32.703 回答
1

正如阿尔伯特所说,应该是mock up entity

在 .NET 中,我创建了您想要测试的这些方法,virtual以便我可以像现在这样扩展真实实体,这Blog将有一个方法,并且我检查 Mm 测试是否达到这个方法,如下所示:MockedBlogMockedBlogoverridePost()

public class MockedBlog : Blog
{
    public void override Post(string text)
    {  PostMethodWasCalled = true; }

    public bool PostMethodWasCalled {get;set;}
}

在测试中,我会做这样的事情

var mockup = new MockedBlog();
// do the preparation, then post
mockup.Post("hello world");
Assert.IsTrue(mockup.PostMethodWasCalled);
于 2013-06-21T04:50:36.223 回答