基本的な事ですけど、ちょっと嵌ったので備忘録として記録
※ PermissionErrorが発生する原因は他にもありますので、この記事の対処法で治るとは限りません。
テスト書く時などに一時的なファイルが必要ならtempfileがおススメです。
tempfile.mkstemp()
は一時ファイルを作成してくれますが、ファイル削除はユーザ自身が行う必要があります。
ファイル操作の後にos.remove()
すればいいかなと思い、書いて実行した結果、PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。: 'C:\\...[一時ファイルのパス]
' のエラーが発生しました。
with構文は抜けてるけどなぁ…と思いながらも色々試した結果、tempfile.mkstemp()
実行時のプロセスがファイルを掴んだままらしいので、os.close()
してあげる必要がありました。
以下、上手く動作したテストの例
class MyFileController():
def __init__(self, path):
self.path = path
def output(self, data):
with open(self.path, "a", newline='', encoding='utf_8_sig', errors='ignore') as f:
f.write(data)
class TestMyFileController(unittest.TestCase):
def test_output(self):
fd, path = tempfile.mkstemp()
mcc = MyFileController(path)
try:
mcc.output("test")
with open(path, encoding='utf_8_sig') as f:
test_data = f.read()
self.assertEqual(headers, "test")
finally:
os.close(fd) # <-- ここね。
os.remove(path)