假设您只使用Autobahn连接(不是原始WebSocket)。

我们如何在没有网络,RPC方法和事件的情况下进行测试?
由于它是Twisted,我认为最合适的工具是Twisted Trial。

但我无法弄清楚如何编写这些测试,而不需要编写大量的样板代码并重新使用Autobahn的内部实现(甚至我不确定我是否能够这样做)。

你会怎么做?

===============>>#1 票数:2 已采纳

这是试图回答我自己的问题。

问题

然后,为了对RPC方法和事件进行单元测试,我们需要假设Autobahn经过了充分测试,我们不必测试它,解决方案变得简单:

解决方案

嘲笑所有。

上下文

在我的应用程序中,我有两种类型的组件(读取ApplicationSession):StandardComponent和DatabaseComponent(继承自StandardComponent)。

单元测试中最大的问题是我们有很多依赖项,比如数据库连接,Redis连接等等......

例子

我在测试中做的是通过unittest.TestCase来修补所有这些对象:

class APITestCase(unittest.TestCase):

    def _patchObject(self, module_name, **kwargs):
        patcher = patch(module_name, **kwargs)
        mock = patcher.start()

        self.patches.append(patcher)
        return mock

    def setUp(self):
        logging.disable(logging.CRITICAL)
        self.patches = []
        self.session = self._patchObject('components.ApplicationAPI')
        self.database = self._patchObject('txpostgres.txpostgres.Connection')

    def tearDown(self):
        for patcher in self.patches:
            patcher.stop()

我在我的测试用例中注入了一个模拟会话和一个模拟数据库。

然后,测试变得非常简单。

每当我调用一个需要调用数据库或从数据库中获取结果的RPC方法时,我都会修补它: self.mocked_auth_user.return_value = (1, "abc", "something", "admin")

在我的测试方法中:

def test_authenticate_success(self):
    self.mocked_auth_user.return_value = (1, "abc", "paris", "admin")

    def _doTest(auth_result):
        attempted_auth_result = {
            "secret": "abc",
            "role": "admin",
            "authid": "1",
            "salt": "paris",
            "iterations": 1000,
            "keylen": 32
        }

        self.assertEqual(auth_result, attempted_auth_result)
        self.mocked_auth_user.assert_called_with(self.api.database, "raito")

    return self.api.authenticate("test", "raito", {}).addCallback(_doTest)

您可以执行一些更高级和有趣的测试,以查看您的方法是否是防错的:

def test_authenticate_authid_not_found(self):
    def _raiseException(db, user):
        return defer.fail(Exception("User {} not found!".format(user)))

    self.mocked_auth_user.side_effect = _raiseException
    return self.failUnlessFailure(self.api.authenticate("test", "raito", {}), AuthenticationError)

对于事件也是如此,你只需要调用它们并测试它们是否发布了一个事件( self.session.publish.assert_called_with(...)

它变得神奇!

无论如何,它解决了单元测试问题,但整合还没有。 我正在努力,但问题可能会使用一些虚拟化技术(Docker)或类似的东西来解决。

  ask by Raito translate from so

未解决问题?本站智能推荐:

1回复

如何在使用Autobahn Python和Twisted ReconnectingClientFactory重新连接后重新注册WAMP被调用者?

我有一个使用Twisted的Autobahn Python客户端应用程序,它连接到Crossbar.io服务器。 使用ReconnectingClientFactory丢失网络连接后,客户端应用程序可以成功重新连接。 客户端在连接时注册被叫方名称,以便其他应用程序可以调用它。 这始终适用于
2回复

如何在高速公路中设置组件角色

我正在使用交叉开关0.11.1,并且我想让高速公路组件使用特定的角色。 当我向组件添加“角色”属性时,如下所示: 运行crossbar start时出现此错误
4回复

使用tac文件使用twistd运行时的高速公路websocket问题

我有一个使用autobahn WebSocket框架使用twisted实现的WebSocket服务器。 当程序使用python运行时,WebSocket服务器运行正常。 但是,如果我通过创建tac文件作为扭曲服务使用twistd服务器运行程序运行它,我在服务器中得到以下错误,而任何客户端尝试
2回复

高速公路websocket

我正在评估和构建一个带有autobahn websocket的简单websocket服务器 有没有人使用子类WrappingWebSocketServerProtocol ,是否有使用此实现的任何示例? 与WebSocketServerProtocol相比有什么好处以及要覆盖/实现的子方
1回复

带有.NET路由器(WampSharp)的高速公路组件

目前,我正在使用WAMP原型,我很好奇这样的事情是否可行,因为我无法使其正常工作: 1,用C#编写WAMP路由器(WampSharp): 2.具有用python编写的组件: 当我运行python脚本时,出现错误: 按照http://autobahn.ws/pytho
1回复

如何从高速公路python脚本中删除此错误?

我在下面的链接中关注有关高速公路python的教程; https://github.com/tavendo/AutobahnPython/blob/master/examples/twisted/wamp/app/calculator/calculator.py 导致错误的代码如下;
1回复

如何在android高速公路websocket中增加帧有效载荷大小

我正在使用android autobahn websocket在android和python龙卷风套接字服务器之间建立连接。 以下是在android中使用的高速公路Websocket代码。 public void start(){ 所有消息都以public void onTe
1回复

所有HTTP标头键在Autobahn websocket服务器的ConnectionRequest.headers中均以小写形式出现

为什么高速公路Web套接字服务器将所有http标头密钥更改为小写? 我需要在OAuth2标准的标头中实现身份验证令牌,并使用自定义标头'Authorization:Bearer $ token'。 但是从WebSocketServerProtocol类的onConnect方法中的autoba
1回复

Redis操作阻止高速公路Web套接字服务器请求

我正在根据我从服务器客户端收到的消息,使用redis为我的Web套接字服务器保存/更新/删除数据(使用高速公路-基于扭曲的Web套接字实现实现)。 对于Redis操作,我使用redis-py软件包。 当有更多并发客户端连接到我的服务器时,我可以看到请求以同步方式服务。 我发现redis操作
1回复

使用Autobahn进行WebSocket通信,而不是从服务器接收

我通过WebSockets实现Autobahn与服务器的连接。 当我点击连接时,它会正确打开套接字并记录该套接字是否已打开。 然后我尝试向服务器发送一个简单{"request":"getSoftwareVersion"} ,当服务器收到这个{"request":"getSoftwareVer