2016-08-21 36 views
3

在丹Schafer的阵营欧洲交谈(https://youtu.be/etax3aEe2dA?t=11m5s),他表现一种方法在一个GraphQL服务器处理授权可委托给商业逻辑层,其中每个业务对象类有一个gen() function充当“单一来源的真相“取得和授权如何在静态函数中测试封装自己创建的JavaScript ES6类?

他暗示这些类可能没有公共构造函数,从而使gen()成为实例化这些类之一的唯一方法。

作为一个C#开发,这不会[容易]单元测试。也许,我从字面上理解他的例子。

在ES2015中,是否有可能用这种模式单独测试业务逻辑?如果是这样,你能举个例子吗?


这里有一个相关的Q & A,但它并不完全解决我的问题:

问:With GraphQL, what is the benefit or necessity of declaring a backing model "class" that does not vary from the GraphQL "Type" in any obvious way?

答:https://stackoverflow.com/a/38209996/6439734

回答

4

我会带会有所不同的方法取决于我试图测试的内容:

  • 如果我试图单元测试自己的授权逻辑,那么我几乎肯定会将这种逻辑分解成如下形式:Code sample from slide from Dan Schafer React Europe 2016 Talk现在,我将单独测试checkCanSee,并传入伪造的Viewer对象和伪造数据。

  • 如果我试图单元测试这个类的一个实例方法的逻辑;比方说,如果我们有 class TodoItem { getItemSummary() { return this.data.title + "(" + this.data.author.name + ")"; } } 并且我想单元测试那个逻辑,有几个选项。在ES6中,我没有意识到让构造函数实际上是私有的简单方法,所以我可以直接在我的单元测试中用假数据调用构造函数。在另一种语言中,我希望能够公开一个只有通过单元测试才能看到的方法,它可以让我用假数据构造一个新对象。第三个想法是提取单元测试值得逻辑: class TodoItem { getItemSummary() { return summarize(this.data.title, this.data.author.name); } } function summarize(title, name) { return title + "(" + name + ")"; } 现在我可以单独测试summarize

  • 如果我试图对整个班级进行端到端测试(其中包括测试gen函数),那么我最好有一种方法来设置Redis的Shimmed实例;一旦我用我的假数据配置了这个垫​​片,我就可以运行真正的TodoItem.gen并测试结果对象。

  • 如果我想单元测试的gen实施,我可能需要使用相同的Redis的垫片上面,同样安装的checkCanSee仿版,使用类似https://facebook.github.io/jest/docs/manual-mocks.html;从那里,我可以侦测到Redis和checkCanSee的电话以确保它们符合预期,并测试Redis返回数据/返回null或checkCanSee返回true/false的各种情况。

  • 如果我想的是消耗TodoItem(说,我们有需要TodoItem作为自变量的函数renderTodoItem),我不会用真正的TodoItem实现在所有的,我会在模拟通过单元测试代码TodoItem以确保我的单元测试renderTodoItem不会意外地依赖于TodoItem的实现细节。

希望这有助于!

+0

感谢您提供的信息......建议您在内部用户和外部用户之间获取数据获取的单一来源?因为两者都有不同的授权逻辑......并且可以看到不同的事物并执行不同的突变 – Stanley

相关问题