如何使用 phpunit 测试 IMAP 操作?

How to test IMAP operations with phpunit?

我刚开始测试和使用一个系统(用 PHP 编写),该系统从 IMAP 服务器获取电子邮件,调查邮件,然后根据邮件的内容将它们移动到不同的邮箱.

我还没有决定使用任何 IMAP 库。关于自动化单元测试的最佳方法是什么?

A​​) 我应该在没有任何真实服务器的情况下模拟所有必要的对象来测试自动化过程吗?如果所有对象都被模拟,并且我想测试一个邮箱对象,例如如果消息被移动 - 那么我只有一个模拟对象,它不提供移动消息的功能。实现某些功能以在模拟对象中移动消息是否正确?不知何故感觉我会写很多代码而不测试任何相关逻辑,因为模拟对象的行为可能与真实对象不同。

B) 我应该使用保存一些测试消息的真实 IMAP 服务器吗?但是每次测试后我都必须将其重置为原始状态。如果哪天有人碰了真实的邮箱,所有的单元测试都可能会崩溃。

感谢您的想法和帮助。 :)

附加信息:可以使用第三方软件/编程语言来模拟 IMAP 服务器,只要它提供与真实 IMAP 系统相同的 API。只有业务逻辑必须在 PHP.

事实证明,使用真实服务器实在是太慢了。因此,我使用模拟对象并以一种只需要提供 Message 对象的方式隔离被测组件,然后使用间谍观察系统的内部状态。所以每个测试都有一个非常具体的范围,它更像是一个单元而不是集成测试。

我使用了真实的电子邮件并将它们保存在 .eml 文件中的磁盘上,我编写了一个实用程序来从中构建一个模拟对象。我研究过的大多数 imap 库都需要连接到真实服务器以检索数据并构建消息对象。所以这部分有点难看,因为它检索消息数据与库完全不同。

另一方面,处理与 IMAP 服务器的通信是库的开发和测试目的,因此如果其 public 接口没有重大变化,这应该没问题。

我还决定与 imap 服务器的通信应该只是手动冒烟和集成测试的一部分,没有必要将其包含在自动化测试中。

也可以使用模仿 IMAP 服务器的流包装器。

我使用 greenmail 进行集成测试。

It is an open source, intuitive and easy-to-use test suite of email servers for testing purposes

http://www.icegreen.com/greenmail/