小编Rob*_*kal的帖子

Mockito和Hamcrest:如何验证Collection参数的调用?

我遇到了Mockito和Hamcrest的仿制问题.

请假设以下界面:

public interface Service {
    void perform(Collection<String> elements);
}
Run Code Online (Sandbox Code Playgroud)

以下测试片段:

Service service = mock(Service.class);

// ... perform business logic

verify(service).perform(Matchers.argThat(contains("a", "b")));
Run Code Online (Sandbox Code Playgroud)

所以我想验证我的业务逻辑实际上是用一个包含"a"和"b"的集合来调用服务.

但是,返回类型contains(...)Matcher<Iterable<? extends E>>,所以在我的情况下Matchers.argThat(...)返回Iterable<String>,这自然不适用于所需的Collection<String>.

我知道我可以使用Hamcrest hasItem和Mockito中提出的参数捕获器验证不一致,但我非常愿意不这样做.

有什么建议!谢谢!

java generics hamcrest mockito

35
推荐指数
4
解决办法
4万
查看次数

如何使用Karma和Jasmine在角度服务中测试"私有"功能

我在我的角应用程序中有一个服务,看起来像这样:

angular.module('BracketService', []).factory('BracketService', [function() {
    function compareByWeight(a, b) {
        return a.weight - b.weight;
    }
    function filterWeightGroup(competitors, lowWeight, highWeight) {
        //filter stuff
    }
    function createBracketsByWeightGroup(weightGroup) {
        //create some brackets
    }
    //set some base line values
    var SUPER_HEAVY_WEIGHT = 500;
    var SUPER_LIGHT_WEIGHT = 20;
    return {
        //create brackets from a list of competitors
        returnBrackets: function(competitors) {
            var brackets = {};
            //get super light weights
            brackets.superLightWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, 0, SUPER_LIGHT_WEIGHT)
                .sort(compareByWeight)
            );
            brackets.superHeavyWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, SUPER_HEAVY_WEIGHT, Infinity)
                .sort(compareByWeight)
            );
            brackets.middleWeights = …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing jasmine angularjs angular-services

30
推荐指数
2
解决办法
2万
查看次数

在Docker Compose中更改postgres容器服务器端口

我正在尝试使用Docker compose在远程服务器上部署第二个数据库容器.这个postgresql服务器在端口5433上运行,而不是第一个postgresql容器使用的5432.

当我设置应用程序时,我收到此错误输出:

web_1  | django.db.utils.OperationalError: could not connect to server: Connection refused
web_1  |    Is the server running on host "db" (172.17.0.2) and accepting
web_1  |    TCP/IP connections on port 5433?
Run Code Online (Sandbox Code Playgroud)

我的docker撰写文件是:

db:
  image: postgres:latest
  environment:
    POSTGRES_PASSWORD: route_admin
    POSTGRES_USER: route_admin
  expose:
    - "5433"
  ports:
    - "5433"
  volumes:
    - ./backups:/home/backups



web:
  build: .
  command:  bash -c "sleep 5 && python -u application/manage.py runserver 0.0.0.0:8081"
  volumes:
    - .:/code
  ports:
    - "81:8081"
  links:
    - db
  environment:
    - PYTHONUNBUFFERED=0
Run Code Online (Sandbox Code Playgroud)

我觉得问题必须是服务器实例上的postgresql.conf文件,将端口设置为5432,导致我的应用程序尝试连接时出错.是否有一种简单的方法可以使用compose文件中的命令更改端口,而不是使用卷来替换文件?

我正在使用官方的postgresql容器来完成这项工作.

postgresql docker docker-compose

23
推荐指数
3
解决办法
2万
查看次数

Firebase身份验证ID令牌具有错误的"aud"声明

我正在尝试验证idToken后端.用户已成功登录到firebase客户端,但当我尝试验证后端的idToken时,我得到的这个不是非常有用的错误消息

Firebase身份验证ID令牌具有错误的"aud"声明

错误消息似乎变得更有用,并归结为在auth密钥中没有项目名称:

错误:Firebase ID令牌具有错误的"aud"(受众群体)声明.预计"stripmall-0000"但得到"617699194096-0aafcvsml0gke61d6077kkark051f3e1.apps.googleusercontent.com".确保ID令牌来自与用于对此SDK进行身份验证的服务帐户相同的Firebase项目.有关如何检索ID令牌的详细信息,请参阅 https://firebase.google.com/docs/auth/server/verify-id-tokens.

任何有丝毫想法的人都会出错?我从客户端正确收到tokenId,这应该不是问题.真诚的应用,如果之前已经被问过,或者以任何其他方式是微不足道的.

  firebase.initializeApp({
        serviceAccount: {
            "type": "service_account",
            "project_id": <project id here>,
            "private_key_id": <key id goes here>,
            "private_key": <key goes here>
            "client_email": <email goes here>,
            "client_id": <my client id>,
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://accounts.google.com/o/oauth2/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": <url goes here>
        },
        databaseURL: <my db url here>
    });

    router.post("/verify", function (req, res) {
        firebase.auth().verifyIdToken(req.body.idToken).then(function (decodedToken) {
            var uid = decodedToken.sub;
            res.send(uid);
        }).catch(function (error, param2) {
            console.log(error);  // 'Firebase Auth ID token has incorrect "aud" claim'
        });

    });
Run Code Online (Sandbox Code Playgroud)

node.js firebase firebase-authentication

17
推荐指数
2
解决办法
4112
查看次数

Flux/Alt数据依赖,如何优雅和惯用处理

我正在使用alt作为项目的焊器实现,并且无法绕过处理两个相关实体的加载存储的最佳方式.我正在使用sources功能和registerAsync来处理我的async/api调用,并使用AltContainer将它们绑定到我的视图.

我有两个由conversationId一对一关联的实体.两者都通过api调用加载:

在此输入图像描述

一旦我的作业商店加载了数据,我想填写对话商店.

我使用源来加载作业存储:

module.exports = {
    fetchJobs() {
        return {
            remote() {
                return axios.get('api/platform/jobs');

            },....
Run Code Online (Sandbox Code Playgroud)

看起来像waitFor()方法的作业,但似乎在一个商店的内容需要转换或与另一个商店的内容合并时使用.我需要根据另一个数据存储的内容获取一个数据存储的内容.

一般来说,我需要:

  • 调用第三方API并将实体列表加载到商店中.
  • 当数据到达时,我需要使用上述每个属性调用另一个API并将该数据加载到另一个存储中.

我天真的解决方案是引用作业存储中的对话操作,并在数据到达时发送事件.像这样的东西:

var jobActions = require('../actions/Jobs');
var conversationActions = require('../actions/Conversations');

class JobStore {
    constructor() {
        this.bindListeners({
            handlefullUpdate: actions.success
        });...

    }

    handlefullUpdate(jobs) {
        this.jobs = jobs;
        conversationActions.fetch.defer(jobs);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这样做违反了商店不应该发送事件的格言,因此我必须使用延迟在调度中间发送一个动作.这对我来说很有意义,因为它似乎沿着这条路走下去,我在我的代码中重新引入了各种各样的副作用; 失去了我应该看到的"功能性管道"之美.

此外,我的工作存储必须持有对任何依赖实体的引用,以便它可以分派适当的操作.在这里,我只有一个,但我可以想象很多.就实体之间的依赖关系而言,这似乎完全倒退.

我想到了几种选择:

我可以在源/操作中调用api/platform/jobs端点来获取所有对话,只是为了获取id.最初的方法更有效率,但这似乎更为真实,因为我失去了所有的交谈.

我也可以使用单个动作/源来获取两者,返回{jobs:{}, conversations: in the action}(使用promises编排依赖关系)并使用它来填充两个存储.但这种方法对我来说似乎不必要地复杂化(我觉得我不应该这样做!).

但我错过了另一种方式吗?看起来奇怪的是,这样一个常见的用例会破坏磁通天堂的优雅和/或迫使我跳过如此多的箍.

@dougajmcdonald 在这里提出了类似的问题,但也许它的措辞过于普遍,并没有得到任何牵引力:

javascript flux node.js reactjs

9
推荐指数
1
解决办法
1205
查看次数

处理Python中的异常行为测试框架

我一直在考虑从鼻子切换到测试行为(摩卡/柴等等已经破坏了我).到目前为止一直很好,但我似乎无法找出除例外测试异常的方法:

@then("It throws a KeyError exception")
def step_impl(context):
try:
    konfigure.load_env_mapping("baz", context.configs)
except KeyError, e:
    assert (e.message == "No baz configuration found") 
Run Code Online (Sandbox Code Playgroud)

用鼻子我可以用一个注释来测试

@raises(KeyError)
Run Code Online (Sandbox Code Playgroud)

我在行为中找不到这样的东西(不在源中,不在示例中,不在此处).能够指定可能在场景轮廓中抛出的异常肯定会很棒.

有人走过这条路吗?

python bdd nose nosetests python-behave

8
推荐指数
3
解决办法
4765
查看次数

Docker权限开发环境使用主机安装的卷

我正在使用docker-compose为一堆symfony2应用程序设置一个可移植的开发环境(虽然我想要做的只是symfony特有的).我决定将本地计算机上的源文件公开为具有docker中所有其他依赖项的数据卷.这样开发人员就可以在本地文件系统上进行编辑.

一切都很好,除了在运行应用程序后我的缓存和日志文件以及/ vendor目录中的composer创建的文件现在归root所有.

我已经在这里阅读了这个问题和一些可能的方法:

将添加文件的权限更改为Docker卷

但是我无法理解我在docker-compose.yml文件中要做出哪些更改,以便当我的symphony容器以docker -compose启动时,所有创建的文件都具有主机上用户的权限.

我发布文件供参考,工作者是php等等直播:

source:
    image: symfony/worker-dev
    volumes:
    - $PWD:/var/www/app
mongodb:
    image: mongo:2.4
    ports:
    - "27017:27017"
    volumes_from:
    - source
worker:
    image: symfony/worker-dev
    ports:
    - "80:80"
    - mongodb
    volumes_from:
    - source
    volumes:
    - "tmp/:/var/log/nginx"
Run Code Online (Sandbox Code Playgroud)

symfony docker docker-compose

7
推荐指数
1
解决办法
927
查看次数

如何使用非主分支将子树推送到heroku

我知道我可以这样做:

git subtree push --prefix server heroku master
Run Code Online (Sandbox Code Playgroud)

推送我的项目的子树(在这种情况下,所有内容都在./server目录下).

我可以执行以下操作来推送非主分支:

git push heroku somebranch:master
Run Code Online (Sandbox Code Playgroud)

但我似乎无法做任何看起来像这样推动非主子树的组合:

git subtree push --prefix server heroku somebranch:master
Run Code Online (Sandbox Code Playgroud)

我明白了:

'somebranch:master' does not look like a ref
Run Code Online (Sandbox Code Playgroud)

我愿意这样做!

git heroku

7
推荐指数
1
解决办法
976
查看次数

由于Hibernate Mapping需要将某些字段作为@Transient,但JSP无法访问它们

在Java中,我可以访问类的Transient字段的值.但是,我不能访问JSP上的相同字段.如何让它们可用于JSP?

我正在使用Hibernate检索值,我认为这个解决方案将是Transformers.aliasToBean选项但是还有其他任何解决方案吗?

反正有没有摆脱瞬态注释但在Hibernate中具有相同的映射?在这种情况下,问题将得到解决.

@AssociationOverrides({
        @AssociationOverride(name = "tta.names", joinColumns = @JoinColumn(name = "id"))})
public class Names implements java.io.Serializable {

    private static final long serialVersionUID = -30956546435023625398L;

    @EmbeddedId
    private TableToAssociate tta = new TableToAssociate();


    @Transient
    public String getid() {
        return tta.getMyIds().getId();
    }

    public void setid(String id) {
        this.tta.getMyIds().setId(id);
    }
Run Code Online (Sandbox Code Playgroud)

在Java中,我可以使用以下代码访问它们

     System.out.println(mystudents.getNames().iterator().next().getId());
Run Code Online (Sandbox Code Playgroud)

在JSP中,我无权访问它们!

    <c:forEach var="nm"items="${mystudents.names}">
                    ${nm.id}
                </c:forEach>
Run Code Online (Sandbox Code Playgroud)

如果我放置另一个非瞬态名称字段,JSP会成功显示该项的值.

java spring jsp hibernate hibernate-mapping

6
推荐指数
1
解决办法
1221
查看次数

仅在组件第一次以惯用和优雅的方式呈现时执行 react-apollo-hooks useQuery

我正在使用最优秀的react-apollo-hooks 库,特别是 useQuery 钩子:

function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: false, id: '0' });
    ...   
    const { data, error } = useQuery(GET_JOBS, { suspend: true });
    if (error) {
        return <div>Error! {error.message}</div>;
    }
    const jobs = data.cxJobs; //This is our data
    ....
    function editCallback(e, more) {
        setDialogOpen({ show: true, id: e });
    }
....
}

Run Code Online (Sandbox Code Playgroud)

当然,一旦我更改了 dialogOpen 状态,组件就会重新渲染并再次执行 graphql 查询。根据对库github repo的建议,我重写了代码以设置一些状态以及 useEffect:

function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: …
Run Code Online (Sandbox Code Playgroud)

reactjs react-apollo react-apollo-hooks

6
推荐指数
1
解决办法
1233
查看次数