<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:1.2em 0px!important">On Mon, Nov 14, 2016 at 6:25 PM oliver <a href="http://mailto:oliver.schoenborn@gmail.com">oliver.schoenborn@gmail.com</a> wrote:</p>
<p style="margin:1.2em 0px!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">I&#39;d like to define a fixture that returns an object that depends on a parameter. The following can&#39;t work because the &quot;a&quot; parameter is expected to be another fixture: <div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">@pytest.fixture<div class="gmail_msg">def some_fixture(a: int):</div><div class="gmail_msg">      return something that depends on value of a</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">class TestCase: </div><div class="gmail_msg">    def test_1(self, some_fixture(a=123)): </div><div class="gmail_msg">        use fixture return value for a=123<br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg">    def test_2(self, some_fixture(a=456)): </div><div class="gmail_msg">        use fixture return value for a=456</div><div class="gmail_msg"> <br class="gmail_msg"></div></div><div class="gmail_msg">Is my only option the good&#39;ol function call, ie remove the fixture decorator and just call the some_fixture function from my tests? </div></div></div></blockquote><p></p></div><p style="margin:1.2em 0px!important"></p>
<p style="margin:1.2em 0px!important">One option is to return an object from the fixture, which you then can call methods and pass the required parameter.</p>
<p style="margin:1.2em 0px!important">For example, instead of (which does not work btw):</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-python" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;background:rgb(35,36,31);color:rgb(248,248,242)"><span class="hljs-decorator" style="color:rgb(117,113,94)">@pytest.fixture</span>
<span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">makepyfile</span><span class="hljs-params" style="color:rgb(248,248,242)">(filename, code)</span>:</span>
    <span class="hljs-comment" style="color:rgb(117,113,94)"># creates a file with the given code</span>

<span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">test_1</span><span class="hljs-params" style="color:rgb(248,248,242)">(makepyfile<span class="hljs-params" style="color:rgb(248,248,242)">(filename=<span class="hljs-string" style="color:rgb(230,219,116)">&#39;foo.py&#39;</span>, code=<span class="hljs-string" style="color:rgb(230,219,116)">&#39;print(&quot;hello&quot;)&#39;</span>)</span>:
    pass</span></span>
</code></pre>
<p style="margin:1.2em 0px!important">Do this:    </p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-python" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;background:rgb(35,36,31);color:rgb(248,248,242)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">class</span> <span class="hljs-title" style="color:rgb(166,226,46);font-style:italic;color:rgb(248,248,242)">Testdir</span>:</span>
    <span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">__init__</span><span class="hljs-params" style="color:rgb(248,248,242)">(self, tmpdir)</span>:</span>
        <span class="hljs-keyword" style="color:rgb(249,38,114)">pass</span>
    <span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">makepyfile</span><span class="hljs-params" style="color:rgb(248,248,242)">(self, filename, code)</span>:</span>
        <span class="hljs-comment" style="color:rgb(117,113,94)"># creates a file with the given code    </span>

<span class="hljs-decorator" style="color:rgb(117,113,94)">@pytest.fixture</span>
<span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">testdir</span><span class="hljs-params" style="color:rgb(248,248,242)">(tmpdir)</span>:</span>
    <span class="hljs-keyword" style="color:rgb(249,38,114)">return</span> Testdir(tmpdir)

<span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">test_1</span><span class="hljs-params" style="color:rgb(248,248,242)">(testdir)</span>:</span>
    testdir.makepyfile(filename=<span class="hljs-string" style="color:rgb(230,219,116)">&#39;foo.py&#39;</span>, code=<span class="hljs-string" style="color:rgb(230,219,116)">&#39;print(&quot;hello&quot;)&#39;</span>)
</code></pre>
<p style="margin:1.2em 0px!important">IOW, make an object which you can delay the desired call to inside a test function.</p>
<p style="margin:1.2em 0px!important">If you give a more concrete example I might make another example.</p>
<p style="margin:1.2em 0px!important">Hope that helps,<br>Bruno.</p>
<p style="margin:1.2em 0px!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
</blockquote><p></p></div><p style="margin:1.2em 0px!important"></p>
<div title="MDH:PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBNb24sIE5vdiAx
NCwgMjAxNiBhdCA2OjI1IFBNIG9saXZlciAmbHQ7b2xpdmVyLnNjaG9lbmJvcm5AZ21haWwuY29t
Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHls
ZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1s
ZWZ0OjFleDsiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9tc2ciPkknZCBsaWtlIHRvIGRl
ZmluZSBhIGZpeHR1cmUgdGhhdCByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGRlcGVuZHMgb24gYSBw
YXJhbWV0ZXIuIFRoZSBmb2xsb3dpbmcgY2FuJ3Qgd29yayBiZWNhdXNlIHRoZSAiYSIgcGFyYW1l
dGVyIGlzIGV4cGVjdGVkIHRvIGJlIGFub3RoZXIgZml4dHVyZTombmJzcDs8ZGl2IGNsYXNzPSJn
bWFpbF9tc2ciPjxiciBjbGFzcz0iZ21haWxfbXNnIj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9t
c2ciPkBweXRlc3QuZml4dHVyZTxkaXYgY2xhc3M9ImdtYWlsX21zZyI+ZGVmIHNvbWVfZml4dHVy
ZShhOiBpbnQpOjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX21zZyI+Jm5ic3A7ICZuYnNwOyAmbmJz
cDsgcmV0dXJuIHNvbWV0aGluZyB0aGF0IGRlcGVuZHMgb24gdmFsdWUgb2YgYTwvZGl2PjxkaXYg
Y2xhc3M9ImdtYWlsX21zZyI+PGJyIGNsYXNzPSJnbWFpbF9tc2ciPjwvZGl2PjxkaXYgY2xhc3M9
ImdtYWlsX21zZyI+Y2xhc3MgVGVzdENhc2U6Jm5ic3A7PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxf
bXNnIj4mbmJzcDsgJm5ic3A7IGRlZiB0ZXN0XzEoc2VsZiwgc29tZV9maXh0dXJlKGE9MTIzKSk6
Jm5ic3A7PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfbXNnIj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAm
bmJzcDsgdXNlIGZpeHR1cmUgcmV0dXJuIHZhbHVlIGZvciBhPTEyMzxiciBjbGFzcz0iZ21haWxf
bXNnIj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9tc2ciPjxkaXYgY2xhc3M9ImdtYWlsX21zZyI+
Jm5ic3A7ICZuYnNwOyBkZWYgdGVzdF8yKHNlbGYsIHNvbWVfZml4dHVyZShhPTQ1NikpOiZuYnNw
OzwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX21zZyI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
IHVzZSBmaXh0dXJlIHJldHVybiB2YWx1ZSBmb3IgYT00NTY8L2Rpdj48ZGl2IGNsYXNzPSJnbWFp
bF9tc2ciPiZuYnNwOzxiciBjbGFzcz0iZ21haWxfbXNnIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNz
PSJnbWFpbF9tc2ciPklzIG15IG9ubHkgb3B0aW9uIHRoZSBnb29kJ29sIGZ1bmN0aW9uIGNhbGws
IGllIHJlbW92ZSB0aGUgZml4dHVyZSBkZWNvcmF0b3IgYW5kIGp1c3QgY2FsbCB0aGUgc29tZV9m
aXh0dXJlIGZ1bmN0aW9uIGZyb20gbXkgdGVzdHM/Jm5ic3A7PC9kaXY+PC9kaXY+PC9kaXY+PC9i
bG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRpdj5PbmUgb3B0aW9uIGlzIHRvIHJldHVy
biBhbiBvYmplY3QgZnJvbSB0aGUgZml4dHVyZSwgd2hpY2ggeW91IHRoZW4gY2FuIGNhbGwgbWV0
aG9kcyBhbmQgcGFzcyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyLjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+Rm9yIGV4YW1wbGUsIGluc3RlYWQgb2YgKHdoaWNoIGRvZXMgbm90IHdvcmsgYnR3KTo8
L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYHB5dGhvbjwvZGl2PjxkaXY+QHB5dGVzdC5maXh0
dXJlPC9kaXY+PGRpdj5kZWYgbWFrZXB5ZmlsZShmaWxlbmFtZSwgY29kZSk6PC9kaXY+PGRpdj4m
bmJzcDsgJm5ic3A7ICMgY3JlYXRlcyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29kZTwvZGl2Pjxk
aXY+PGJyPjwvZGl2PjxkaXY+ZGVmIHRlc3RfMShtYWtlcHlmaWxlKGZpbGVuYW1lPSdmb28ucHkn
LCBjb2RlPSdwcmludCgiaGVsbG8iKScpOjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBwYXNzPC9k
aXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkRvIHRo
aXM6ICZuYnNwOyAmbmJzcDs8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYHB5dGhvbiZuYnNw
OyZuYnNwOzxicj48L2Rpdj48ZGl2PmNsYXNzIFRlc3RkaXI6PC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7IGRlZiBfX2luaXRfXyhzZWxmLCB0bXBkaXIpOjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7IHBhc3M8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgZGVmIG1ha2VweWZpbGUo
c2VsZiwgZmlsZW5hbWUsIGNvZGUpOjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7ICMgY3JlYXRlcyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29kZSAmbmJzcDsgJm5ic3A7PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj5AcHl0ZXN0LmZpeHR1cmU8L2Rpdj48ZGl2PmRlZiB0ZXN0
ZGlyKHRtcGRpcik6PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHJldHVybiBUZXN0ZGlyKHRtcGRp
cik8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmRlZiB0ZXN0XzEodGVzdGRpcik6PC9kaXY+PGRp
dj4mbmJzcDsgJm5ic3A7IHRlc3RkaXIubWFrZXB5ZmlsZShmaWxlbmFtZT0nZm9vLnB5JywgY29k
ZT0ncHJpbnQoImhlbGxvIiknKTwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj5JT1csIG1ha2UgYW4gb2JqZWN0IHdoaWNoIHlvdSBjYW4gZGVsYXkgdGhlIGRlc2lyZWQgY2Fs
bCB0byBpbnNpZGUgYSB0ZXN0IGZ1bmN0aW9uLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SWYg
eW91IGdpdmUgYSBtb3JlIGNvbmNyZXRlIGV4YW1wbGUgSSBtaWdodCBtYWtlIGFub3RoZXIgZXhh
bXBsZS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkhvcGUgdGhhdCBoZWxwcyw8L2Rpdj48ZGl2
PkJydW5vLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2PjxibG9ja3F1
b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1s
ZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXg7Ij48YnIgY2xhc3M9ImdtYWlsX21z
ZyI+CjwvYmxvY2txdW90ZT48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>