Testing "script-level" code


What is everyone’s approach to testing a script (i.e. a self-contained ps1 that contains parameters, functions, and code)? Rather than a module that contains a function per file.

Basically same as Dot Sourcing in test fixture not practical for all scripts · Issue #21 · pester/Pester · GitHub

Would you always refactor to a module, or extract a function definition out of the script file (to avoid dot-sourcing?)


To answer my own question, I’ve found a post by Jakub with possible solutions.

Not sure if Pester 4.0 has any other solutions?

Unfortunately, there is no good way to do it. Pester loves functions and if your code is broken up into functions, it makes your code not only cleaner but easier to test.

Before you spend too much time trying to get this to work I’d first look to see if you can split out that script into multiple functions and then write tests for those.

I’ve gone with the UnderTest switch for now. Problem is it’s not my code and I’m fine with recommending it gets re-factored, but hoped there might now be an easier way to extract a function (for example).

Thanks for the reply Adam.

Thanks for reminding me of that article, I think you could solve that problem by building the whole script from smaller files before publishing. That way, during development you can test it as usual, and then on build we could have file-based-mock function that either uses the real file, or injects it’s own definition. That would allow you to create version of the whole file that would be disconnected from the real architecture. Maybe we could leverage AST for that somehow, or template file where we know where to inject our functions.

The whole problem pretty much is that in real script our mocked functions get shadowed by functions defined by the script, so we need a way to inspect the functions your script defines, generate mocks for them (if any mocks are specified), injects the mocks in the file, and then run.

I will prototype it in the evening. :slight_smile:

Here you go, splitting the file (on comments now, but that can be done without). Might be useful?

The links don’t render properly here, making them -pre-.


Excellent, thanks Jakub! I’ll have a play and see how useful it is for the scenario I was testing.