diff --git a/news/2 Fixes/11264.md b/news/2 Fixes/11264.md new file mode 100644 index 000000000000..36873e9c5dd7 --- /dev/null +++ b/news/2 Fixes/11264.md @@ -0,0 +1 @@ +Allow user modules import when discovering tests. diff --git a/src/client/testing/unittest/services/discoveryService.ts b/src/client/testing/unittest/services/discoveryService.ts index a1a246634978..f09901e37f5f 100644 --- a/src/client/testing/unittest/services/discoveryService.ts +++ b/src/client/testing/unittest/services/discoveryService.ts @@ -29,7 +29,9 @@ export class TestDiscoveryService implements ITestDiscoveryService { const pythonScript = this.getDiscoveryScript(options); const unitTestOptions = this.translateOptions(options); const runOptions: Options = { - args: internalPython.execCode(pythonScript), + // unittest needs to load modules in the workspace + // isolating it breaks unittest discovery + args: internalPython.execCode(pythonScript, false), cwd: options.cwd, workspaceFolder: options.workspaceFolder, token: options.token, diff --git a/src/test/testing/unittest/unittest.discovery.unit.test.ts b/src/test/testing/unittest/unittest.discovery.unit.test.ts index 32ebaa77f22f..1d03baada13e 100644 --- a/src/test/testing/unittest/unittest.discovery.unit.test.ts +++ b/src/test/testing/unittest/unittest.discovery.unit.test.ts @@ -71,8 +71,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.contain(dir); - expect(opts.args[2]).to.not.contain('loader.discover("."'); + expect(opts.args[1]).to.contain(dir); + expect(opts.args[1]).to.not.contain('loader.discover("."'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); @@ -117,8 +117,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.contain(dir); - expect(opts.args[2]).to.not.contain('loader.discover("."'); + expect(opts.args[1]).to.contain(dir); + expect(opts.args[1]).to.not.contain('loader.discover("."'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); @@ -163,8 +163,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.not.contain(dir); - expect(opts.args[2]).to.contain('loader.discover("."'); + expect(opts.args[1]).to.not.contain(dir); + expect(opts.args[1]).to.contain('loader.discover("."'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); @@ -205,8 +205,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.contain(pattern); - expect(opts.args[2]).to.not.contain('test*.py'); + expect(opts.args[1]).to.contain(pattern); + expect(opts.args[1]).to.not.contain('test*.py'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); @@ -251,8 +251,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.contain(pattern); - expect(opts.args[2]).to.not.contain('test*.py'); + expect(opts.args[1]).to.contain(pattern); + expect(opts.args[1]).to.not.contain('test*.py'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); @@ -297,8 +297,8 @@ suite('Unit Tests - Unittest - Discovery', () => { .setup((r) => r.run(typeMoq.It.isValue(UNITTEST_PROVIDER), typeMoq.It.isAny())) .callback((_, opts: Options) => { expect(opts.args).to.include('-c'); - expect(opts.args[2]).to.not.contain(pattern); - expect(opts.args[2]).to.contain('test*.py'); + expect(opts.args[1]).to.not.contain(pattern); + expect(opts.args[1]).to.contain('test*.py'); }) .returns(() => Promise.resolve(runOutput)) .verifiable(typeMoq.Times.once()); diff --git a/src/test/testing/unittest/unittest.run.test.ts b/src/test/testing/unittest/unittest.run.test.ts index 8cb304a05f1b..85428c185634 100644 --- a/src/test/testing/unittest/unittest.run.test.ts +++ b/src/test/testing/unittest/unittest.run.test.ts @@ -145,11 +145,10 @@ suite('Unit Tests - unittest - run with mocked process output', () => { .create()) as MockProcessService; procService.onExecObservable((_file, args, _options, callback) => { if ( - //args[0] is pyvsc-run-isolated.py. args.length > 1 && - args[1] === '-c' && - args[2].includes('import unittest') && - args[2].includes('loader = unittest.TestLoader()') + args[0] === '-c' && + args[1].includes('import unittest') && + args[1].includes('loader = unittest.TestLoader()') ) { callback({ // Ensure any spaces added during code formatting or the like are removed