在单元测试中获取Celery重试方法的参数

时间:2018-07-05 13:58:36

标签: python-3.x asynchronous celery django-celery

我有一个Celery任务,我延迟地异步调用它。发生异常时,它会重试自身,并且每次尝试都会增加延迟。

public class Demo {

    Set<String> freinds = new HashSet<>();

    public static void main(String[] args) {

        String[][] emailArray = new String[][] {
                { "abc@gmail.com", "abc1@gmail.com,abc2@gmail.com,abc3@gmail.com,1212@gmail.com" },
                { "abc1@gmail.com", "bcs1@gmail.combc2@gmail.com,bcds3@gmail.com" },
                { "bc@gmail.com", "bc1@gmail.combc2@gmail.com,bc3@gmail.com" } };

        new Demo().sendMail("@gmail.combc2@gmail.com", "sdsd", emailArray);

    }

    void sendMail(String email, String message, String[][] freindsArray) {
        Map<String, Email> emailsMap = new HashMap<>();

        for (int i = 0; i < freindsArray.length; i++) {
            for (int j = 0; j < 1; j++) {
                Email e = new Email(freindsArray[i][j]);
                e.addConnectedNodes(freindsArray[i][j + 1]);
                emailsMap.put(e.email, e);
            }
        }
        if (emailsMap.containsKey(email)) {
            Demo.getNodesFollowAllEdges(emailsMap.get(email), emailsMap).forEach(e -> {
                System.out.println(e);
            });
        } else {
            System.out.println("no emails exist");
        }


    }

    private static Set<String> getNodesFollowAllEdges(Email e, Map<String, Email> emailsMap) {
        Set<String> nodes = getNodesFollowAllEdges(e, new HashSet<>(), emailsMap);
        nodes.remove(e.email);
        return nodes;
    }

    private static Set<String> getNodesFollowAllEdges(Email node, Set<String> visited, Map<String, Email> emailsMap) {

        if (node.getConnectedEmails().isEmpty()) {
            return visited;
        }

        for (String n : node.getConnectedEmails()) {
            if (!visited.contains(n)) {
                visited.add(n);
                if (emailsMap.get(n) != null) {
                    getNodesFollowAllEdges(emailsMap.get(n), visited, emailsMap);
                }
            }
        }
        return visited;
    }

}

class Email {
    String email;
    List<String> freindsEmails = new ArrayList<>();

    public List<String> getConnectedEmails() {
        return freindsEmails;
    }

    public Email(String email) {
        this.email = email;
    }

    public void addConnectedNodes(String friendsEmail) {
        freindsEmails.addAll(Arrays.asList(friendsEmail.split(",")));
    }

}

这在实践中可以正常工作,但是我正在尝试编写一个单元测试,以检查倒计时是否确实具有正确的值。

我试图做的是模拟cancel_issue_request.retry方法,但是一旦这样做,该方法本身就会中断并且不会重试该任务。 我以为您可以用仍然可以使用spec = celery.task.Task.retry来执行其所有功能的方法来模拟方法,但是我无法使其正常工作,请给我启发?

或者,我想在某个地方阅读Celery进行的重试,但是我无法从Celery中获取该信息。

1 个答案:

答案 0 :(得分:0)

在不破坏功能的情况下设法模拟该功能:

cancel_issue_request.retry = Mock(side_effect=cancel_issue_request.retry)