MINI MINI MANI MO
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Layers — zope.configuration 4.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '4.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="zope.configuration 4.0 documentation" href="index.html" />
<link rel="next" title="zope.component API Reference" href="api.html" />
<link rel="prev" title="The current component registry" href="hooks.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="api.html" title="zope.component API Reference"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="hooks.html" title="The current component registry"
accesskey="P">previous</a> |</li>
<li><a href="index.html">zope.configuration 4.0 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="layers">
<h1>Layers<a class="headerlink" href="#layers" title="Permalink to this headline">¶</a></h1>
<p>zope.component.testlayer defines two things:</p>
<ul class="simple">
<li>a LayerBase that makes it easier and saner to use zope.testing’s
test layers.</li>
<li>a ZCMLLayer which lets you implement a layer that loads up some
ZCML.</li>
</ul>
<div class="section" id="layerbase">
<h2>LayerBase<a class="headerlink" href="#layerbase" title="Permalink to this headline">¶</a></h2>
<p>We check whether our LayerBase can be used to create layers of our
own. We do this simply by subclassing:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">zope.component.testlayer</span> <span class="kn">import</span> <span class="n">LayerBase</span>
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">OurLayer</span><span class="p">(</span><span class="n">LayerBase</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">super</span><span class="p">(</span><span class="n">OurLayer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">setUp</span><span class="p">()</span>
<span class="gp">... </span> <span class="k">print</span> <span class="s">"setUp called"</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">super</span><span class="p">(</span><span class="n">OurLayer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">tearDown</span><span class="p">()</span>
<span class="gp">... </span> <span class="k">print</span> <span class="s">"tearDown called"</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">testSetUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">super</span><span class="p">(</span><span class="n">OurLayer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">testSetUp</span><span class="p">()</span>
<span class="gp">... </span> <span class="k">print</span> <span class="s">"testSetUp called"</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">testTearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">super</span><span class="p">(</span><span class="n">OurLayer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">testTearDown</span><span class="p">()</span>
<span class="gp">... </span> <span class="k">print</span> <span class="s">"testTearDown called"</span>
</pre></div>
</div>
<p>Note that if we wanted to ensure that the methods of the superclass
were called we have to use super(). In this case we actually wouldn’t
need to, as these methods do nothing at all, but we just ensure that
they are there in the first place.</p>
<p>Let’s instantiate our layer. We need to supply it with the package the
layer is defined in:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">zope.component</span>
<span class="gp">>>> </span><span class="n">layer</span> <span class="o">=</span> <span class="n">OurLayer</span><span class="p">(</span><span class="n">zope</span><span class="o">.</span><span class="n">component</span><span class="p">)</span>
</pre></div>
</div>
<p>Now we run some tests with this layer:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">unittest</span>
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">TestCase</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">layer</span> <span class="o">=</span> <span class="n">layer</span>
<span class="gp">...</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">testFoo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">print</span> <span class="s">"testFoo"</span>
<span class="gp">>>> </span><span class="n">suite</span> <span class="o">=</span> <span class="n">unittest</span><span class="o">.</span><span class="n">TestSuite</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">suite</span><span class="o">.</span><span class="n">addTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">makeSuite</span><span class="p">(</span><span class="n">TestCase</span><span class="p">))</span>
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">zope.testrunner.runner</span> <span class="kn">import</span> <span class="n">Runner</span>
<span class="gp">>>> </span><span class="n">runner</span> <span class="o">=</span> <span class="n">Runner</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[],</span> <span class="n">found_suites</span><span class="o">=</span><span class="p">[</span><span class="n">suite</span><span class="p">])</span>
<span class="gp">>>> </span><span class="n">succeeded</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
<span class="go">Running zope.component.OurLayer tests:</span>
<span class="go"> Set up zope.component.OurLayer setUp called</span>
<span class="go">in ... seconds.</span>
<span class="go">testSetUp called</span>
<span class="go">testFoo</span>
<span class="go">testTearDown called</span>
<span class="go"> Ran 1 tests with 0 failures and 0 errors in ... seconds.</span>
<span class="go">Tearing down left over layers:</span>
<span class="go"> Tear down zope.component.OurLayer tearDown called</span>
<span class="go">in ... seconds.</span>
</pre></div>
</div>
</div>
<div class="section" id="zcmllayer">
<h2>ZCMLLayer<a class="headerlink" href="#zcmllayer" title="Permalink to this headline">¶</a></h2>
<p>We now want a layer that loads up some ZCML from a file. The default
is <tt class="docutils literal"><span class="pre">ftesting.zcml</span></tt>, but here we’ll load a test <tt class="docutils literal"><span class="pre">testlayer.zcml</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">zope.component.testlayer</span> <span class="kn">import</span> <span class="n">ZCMLFileLayer</span>
<span class="gp">>>> </span><span class="kn">import</span> <span class="nn">zope.component.testfiles</span>
<span class="gp">>>> </span><span class="n">zcml_file_layer</span> <span class="o">=</span> <span class="n">ZCMLFileLayer</span><span class="p">(</span>
<span class="gp">... </span> <span class="n">zope</span><span class="o">.</span><span class="n">component</span><span class="o">.</span><span class="n">testfiles</span><span class="p">,</span>
<span class="gp">... </span> <span class="s">'testlayer.zcml'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">TestCase</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">layer</span> <span class="o">=</span> <span class="n">zcml_file_layer</span>
<span class="gp">...</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">testFoo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="gp">... </span> <span class="c"># we should now have the adapter registered</span>
<span class="gp">... </span> <span class="kn">from</span> <span class="nn">zope</span> <span class="kn">import</span> <span class="n">component</span>
<span class="gp">... </span> <span class="kn">from</span> <span class="nn">zope.component.testfiles</span> <span class="kn">import</span> <span class="n">components</span>
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">assert_</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span>
<span class="gp">... </span> <span class="n">components</span><span class="o">.</span><span class="n">IApp2</span><span class="p">(</span><span class="n">components</span><span class="o">.</span><span class="n">content</span><span class="p">),</span> <span class="n">components</span><span class="o">.</span><span class="n">Comp2</span><span class="p">))</span>
</pre></div>
</div>
<p>Since the ZCML sets up an adapter, we expect the tests to pass:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">suite</span> <span class="o">=</span> <span class="n">unittest</span><span class="o">.</span><span class="n">TestSuite</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">suite</span><span class="o">.</span><span class="n">addTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">makeSuite</span><span class="p">(</span><span class="n">TestCase</span><span class="p">))</span>
<span class="gp">>>> </span><span class="n">runner</span> <span class="o">=</span> <span class="n">Runner</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="p">[],</span> <span class="n">found_suites</span><span class="o">=</span><span class="p">[</span><span class="n">suite</span><span class="p">])</span>
<span class="gp">>>> </span><span class="n">succeeded</span> <span class="o">=</span> <span class="n">runner</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
<span class="go">Running zope.component.testfiles.ZCMLFileLayer tests:</span>
<span class="go"> Set up zope.component.testfiles.ZCMLFileLayer in ... seconds.</span>
<span class="go"> Ran 1 tests with 0 failures and 0 errors in ... seconds.</span>
<span class="go">Tearing down left over layers:</span>
<span class="go"> Tear down zope.component.testfiles.ZCMLFileLayer in ... seconds.</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Layers</a><ul>
<li><a class="reference internal" href="#layerbase">LayerBase</a></li>
<li><a class="reference internal" href="#zcmllayer">ZCMLLayer</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="hooks.html"
title="previous chapter">The current component registry</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="api.html"
title="next chapter"><tt class="docutils literal"><span class="pre">zope.component</span></tt> API Reference</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/testlayer.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="api.html" title="zope.component API Reference"
>next</a> |</li>
<li class="right" >
<a href="hooks.html" title="The current component registry"
>previous</a> |</li>
<li><a href="index.html">zope.configuration 4.0 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2012, Zope Foundation Contributors.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>
OHA YOOOO