spectronã§ãã¹ããæžããŠãŸããã¡ãã£ãšèºããŠãããŸãã
倿Žå¯Ÿè±¡ã®ãã¡ã€ã«ãèŠãããã«dialogãéããŠãã©ã«ããæå®ãããšå¯Ÿè±¡ãã¡ã€ã«äžèЧãåºãŠããåããå®è£
ãããŠããã®ã§ãããspectronã¯dialogã®æäœãã©ããã§ããªãããã§ãã
Electronã®dialogã¯ãã€ãã£ãã®dialogãåŒã³åºããããªã®ã§ãã³ããªã³ã°ã§ããªãã®ãããããŸããã
ã§ã¯ä»ã®äººéã¯ã©ããã£ãŠããã®ããªãšæ€çŽ¢ããŠã¿ããšspectron-fake-dialogãšãããºããªãªnpmãã§ãŠããŸãããã©ãããMenuãspectronã§æäœã§ããªãããã§åãäœè ã®æ¹ããã¡ããäœã£ãŠããŸãã
䌌ããããªnpmã«spectron-dialog-addonãšãspectron-menu-addonãèŠã€ãã£ãã®ã§ããTypeScriptã§æžãçŽããŠããã ãã®ãããªã®ã§ã©ã¡ãã䜿ã£ãŠãè¯ãããã§ãã
ãã®npmã䜿ãã°ãã¹ãã§ãããã§ããã©åçŽã«dialogãstubã§ããªãããªãšããµãšæã£ãŠããŸããããããã°FuseBoxã®ãããªãã³ãã©ãŒã䜿ãå Žåãã©ãããã°ããã®ãïŒãšããçåãæ¹§ããŠããŠããŸã£ãã®ã§ãŸãã¯FuseBoxã§ã®stubã®ããæ¹ã調ã¹ãŠã¿ãŸããã
å眮ãé·ããªããŸãããFuseBoxã§ã®stubã®è©±ã«ãªããŸãã
ãŸã調ã¹ãŠã¿ããšrequireã§ã€ã³ããŒãããŠãããããªãã®ãä¹ã£åãã«ã¯rewire ãproxyquireãšãããã®ããããŸãããã§ããã¯ãwebpackã®ãããªãã³ãã©ãŒã䜿ãå Žåã¯å°çšã®loaderã ã£ãããçšæãããŠããŠããããããã®ãŸãŸäœ¿ãããšã¯ã§ããªãããã§ãã
ãšããããšã§ãŸãã¯FuseBoxã®æ¹ãã調ã¹ãŠããã®ãè¯ãããã
ãŸããæ€çŽ¢æè¡ãé§äœ¿ããŠèª¿ã¹ãŠã¿ããšFuseBoxã§äœ¿ãããã©ã°ã€ã³proxyrequireãèŠã€ãããŸãããFuseBoxã ãã§ãªãWebpackããµããŒãããŠããããã§ãã
ããããã®proxyrequireãåæ§ãªæ©èœã®proxyquireãšååã䌌ãããŠããŠæ··ä¹±ããŸãããã€ã³ã¹ããŒã«ããnpmãééãããproxyrequireã§æ€çŽ¢ãããšproxyquireã®æ å ±ãåºãŠããããããŒãžã¿ã€ãã«ãproxyrequireã«ãªã£ãŠããã®ã«proxyquireã«ã€ããŠæžãããå 容ã ã£ããæ°ã¥ããŸã§æéãããã£ãŠããŸã£ãã
ãããŠå ¬åŒã®èª¬æãã¿ããšproxyquireã䜿ã£ãããšããã人åæã§æžãããŠããã®ããã£ã±ãããŠããŠããããããªãã£ãã®ã§ãµã³ãã«ãäœã£ãŠåããèŠãŠã¿ãŸããã
ãšããããé©åœãªïŒã€ã®TypeScriptãæžããŠã¿ãã
bar.ts
export class Bar {
readonly str: string;
constructor(str: string) {
this.str = str;
}
get_str(): string {
return this.str;
}
}
export const bar = new Bar('Hell world');Code language: JavaScript (javascript)foo.ts
import {bar} from './bar';
export const foo = (str: string) => {
const ret = bar.get_str();
console.log(ret);
return ret;
};Code language: JavaScript (javascript)barãstubãããã®ã§ãããã³ãã«ã®ãšã³ããªãŒãã¡ã€ã«ã«ãã©ã°ã€ã³ã®èšå®ããããšã ãã¿ãããªã®ã§å¥éãšã³ããªãŒãã¡ã€ã«ãäœæ(äžç·ã«ã§ããåé¿çãå ¬åŒã®èª¬æã«ãã)
index.ts
require('proxyrequire').registerGlobals();
import {foo} from './foo';
const app = foo;
export {app};Code language: JavaScript (javascript)require(‘proxyrequire’).registerGlobals();ãstubããããã®ããŸããªãã§ãã
ããšã¯FuseBoxã®èšå®ãã¡ã€ã«ã«ã远å ã§ãã
ãã€ã³ãã ãæžããŠãããŸãã
fuse.js
.....
} = require('fuse-box/es6');
const StubPlugin = require('proxyrequire').FuseBoxStubPlugin(/foo.ts/);
.....
plugins: [
EnvPlugin({NODE_ENV: isProduction ? 'production' : 'development'}),
StubPlugin,
[SassPlugin(), CSSPlugin()],
.....
const app = fuse.bundle('renderer').instructions(`> [index.ts]`);
.....Code language: JavaScript (javascript)FuseBoxStubPlugin(/foo.ts/)ã®è¡ã§ãã©ã°ã€ã³äœæã«ãªããŸããåŒæ°ã§é©çšãããœãŒã¹ãã¡ã€ã«ã®ãã£ã«ã¿ãŒãããŠããããã®å Žåã¯foo.tså
ã®barãstubåãããŸã(ä»ã«requireãããã°å¯Ÿè±¡ã«ãªã)ããšã³ããªãŒãã¡ã€ã«ã¯å«ãŸãªãããã«ããŸãããã
plugins: ã§StubPluginãåŒã¶ããã«è¿œå ããŸãã
ããšã¯ãã¹ããæžãã ãã§ããAVAã§æžããŠã¿ãŸããã
test.js
import test from 'ava';
import {proxy} from 'proxyrequire';
import * as app from '../renderer.js';
test(async (t) => {
let res = '';
// Before mocking
res = app.FuseBox.main('default/index.js').app();
t.is(res, 'Hell world');
class Mock_bar {
get_str() {
return 'fake';
}
}
// Mocking
const Stub = proxy(() => require('../renderer.js'), {
'./bar': {bar: new Mock_bar()},
});
res = app.FuseBox.main('default/index.js').app();
// After mocking
t.not(res, 'Hell world');
t.is(res, 'fake');
});Code language: JavaScript (javascript)Mockããåã®æåŸ å€ã¯Hello worldã§ããMock_barãstubã§ãã眮ãæãã®æžãæ¹ã¯proxyquireãšåãããã«æžããŸããMockããããšã¯fakeãæåŸ å€ã§ããæ³å®éãã«ãã¹ãããã¹ããã®ã§æ¬¡åã¯Spectronã§è©ŠããŠã¿ãããšæããŸãã
远èš
FuseBoxã®ãã©ã°ã€ã³proxyrequireã§Electronã®APIãstubã§ããªãããšè©Šè¡é¯èª€ããã®ã§ããããŸããããŸããã§ãããã©ãããåçã«stubããéã«Electronã®ã©ã€ãã©ãªãåèªèŸŒããåãã®ããã§ãåèªèŸŒæã«æ¢åã®ã€ã³ã¹ã¿ã³ã¹ãäœãçŽãã«ãªã£ãŠç Žæ£ãããŠçµææ»ãã§ããŸãããã§ãã
ãšããããšã§çŽ çŽã«spectron-dialog-addonã§stubããæ¹åã«è»éä¿®æ£ã§ãã
ãŸã£ããåé¡ãªãåäœããŠããã®ã§æ©ãããã«ããã°ããã£ãããªããšæã仿¥æ€ã®é ã§ãã

