Consider the following scenario (this is not production code):
class MyClass {
public function myMethod() {
// create a directory
$path = sys_get_temp_dir() . '/' . md5(rand());
if(!mkdir($path)) {
throw new Exception("mkdir() failed.");
}
// create a file in that folder
$myFile = fopen("$path/myFile.txt", "w");
if(!$myFile) {
throw new Exception("Cannot open file handle.");
}
}
}
Right, so what’s the problem? Code coverage reports that this line is not covered:
throw new Exception("Cannot open file handle.");
Which is correct, but since I’m creating the folder above logically it would seem impossible for the fopen() to fail (except maybe in extreme circumstances, like disk at 100 %).
I could ignore the code from code coverage but thats kind of cheating. Is there any way I can mock the file system so that it can recognise myFile.txt and mock the file system unable to create the file?
vfsStreamis astream wrapperfor avirtual filesystemthat is useful in unit tests to mock the real filesystem. You can install it from composer.More Info at:
https://github.com/mikey179/vfsStream
https://phpunit.de/manual/current/en/test-doubles.html