[TFUI] Re: why is Presenter First better for TDD?

Phlip <[email protected]> Fri, 07 Aug 2009 14:35:09 -0700
Newsgroups gmane.comp.programming.test-first-user-interfaces,gmane.comp.programming.test-driven-development
Message-ID <[email protected]>
--WOczvoNCb8kxiHKMNs5sW7XeBE0DVE8BU9qw3mJ
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

>     Posted by: "Carlos Ble" [email protected] carlosble

> I've just read the wikipedia entry for Presenter First patter:
> http://en.wikipedia.org/wiki/Presenter_First
> 
> To read about TDD there is nice but I don't see why TDD is related to
> Presenter First more than MVC or MVP.

WikiPedia might possibly be ... (mumble) ... incorrect. It has been known to
happen before. It's certainly just an aberration.

> They are all basically the same. One can test drive a controller too.
> I don't remeber hearing about TDD in the
> presenter first shows with Ron Jacobs.

If "presenter first" is derived from "Humble Dialog Box", it's not cannon
(meaning "officially correct"). It's just a really good idea, sometimes.

> A paragraph within the article says:
>     "A customer will generally explain features in terms of 'when'
> statements - for example, "When I click the 'save' button then the
> file should be saved and the unsaved file warning should disappear."

To TDD that, write a test that changes a view's "modified" flag, possibly by
modifying its document, then assert that the view activates the "modified" icon.
If, for example, it highlights the Save button, then the test can assert that
the code selected the highlit icon behind that button.

Then a related test can modify the file, simulate a click to the Save button
(usually by calling the handler method that Save would have called). Then the
test asserts the file on disk has changed (yes, sometimes tests detect
filesystem side-effects!). Then the test checks that the button changed its
icon, and that the "modified" flag is down.

> This is wrong again to me. Customers should not decide how that UI
> works but what they need. User stories should not
> be attached to user interfaces I think.

Use Cases should not attach to user interfaces. The early User Stories are like
Use Cases, because the Onsite Customer is not a real Usability Designer, and
should not play one on TV.

Later User Stories will easily refer to changes to a UI that already exists, so
they do not work like Use Cases.

-- 
   Phlip


--WOczvoNCb8kxiHKMNs5sW7XeBE0DVE8BU9qw3mJ
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>





<body style="background-color: #ffffff;">
<span style="display:none">&nbsp;</span>
<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="width:655px; position:relative;">
<div id="ygrp-msg" style="width: 470px; margin:0; padding:0 25px 0 0; float:left; z-index:1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->
    <div id="ygrp-text" >
                  <p>&gt;     Posted by: &quot;Carlos Ble&quot; <a href="mailto:ble.jurado%40gmail.com">ble.jurado@gmail.<wbr>com</a> carlosble<br>
<br>
&gt; I've just read the wikipedia entry for Presenter First patter:<br>
&gt; <a href="http://en.wikipedia.org/wiki/Presenter_First">http://en.wikipedia<wbr>.org/wiki/<wbr>Presenter_<wbr>First</a><br>
&gt; <br>
&gt; To read about TDD there is nice but I don't see why TDD is related to<br>
&gt; Presenter First more than MVC or MVP.<br>
<br>
WikiPedia might possibly be ... (mumble) ... incorrect. It has been known to<br>
happen before. It's certainly just an aberration.<br>
<br>
&gt; They are all basically the same. One can test drive a controller too.<br>
&gt; I don't remeber hearing about TDD in the<br>
&gt; presenter first shows with Ron Jacobs.<br>
<br>
If &quot;presenter first&quot; is derived from &quot;Humble Dialog Box&quot;, it's not cannon<br>
(meaning &quot;officially correct&quot;). It's just a really good idea, sometimes.<br>
<br>
&gt; A paragraph within the article says:<br>
&gt;     &quot;A customer will generally explain features in terms of 'when'<br>
&gt; statements - for example, &quot;When I click the 'save' button then the<br>
&gt; file should be saved and the unsaved file warning should disappear.&quot;<br>
<br>
To TDD that, write a test that changes a view's &quot;modified&quot; flag, possibly by<br>
modifying its document, then assert that the view activates the &quot;modified&quot; icon.<br>
If, for example, it highlights the Save button, then the test can assert that<br>
the code selected the highlit icon behind that button.<br>
<br>
Then a related test can modify the file, simulate a click to the Save button<br>
(usually by calling the handler method that Save would have called). Then the<br>
test asserts the file on disk has changed (yes, sometimes tests detect<br>
filesystem side-effects!<wbr>). Then the test checks that the button changed its<br>
icon, and that the &quot;modified&quot; flag is down.<br>
<br>
&gt; This is wrong again to me. Customers should not decide how that UI<br>
&gt; works but what they need. User stories should not<br>
&gt; be attached to user interfaces I think.<br>
<br>
Use Cases should not attach to user interfaces. The early User Stories are like<br>
Use Cases, because the Onsite Customer is not a real Usability Designer, and<br>
should not play one on TV.<br>
<br>
Later User Stories will easily refer to changes to a UI that already exists, so<br>
they do not work like Use Cases.<br>
<br>
-- <br>
   Phlip<br>
<br>
</p>
 

    </div>  

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div width="1" style="color: white; clear: both;">__._,_.___</div>

           
  
    
    <!-- Start the section with Message In topic -->
    <div id="ygrp-actbar" style="clear: both; margini-bottom: 25px; white-space:nowrap; color: #666; text-align: right;">
              <span class="left" style="float: left; white-space:nowrap;">
          <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/1049;_ylc=X3oDMTM0a3RvNDI4BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNDkEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjQ5NjgwOTgxBHRwY0lkAzEwNDk-">
            Messages in this topic          </a> (<span class="bld" style="font-weight:bold;">1</span>)
        </span>
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJwYjJxbHUwBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNDkEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxMjQ5NjgwOTgx?act=reply&messageNum=1049">
          <span class="bld" style="font-weight:bold;">
            Reply          </span> (via web post)
        </a>  | 
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlZ3M4aTI5BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI0OTY4MDk4MQ--" class="bld" style="font-weight:bold;">
          Start a new topic        </a>
          </div> 
    <!-------     Start Nav Bar  ------>
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-vitnav" style="padding-top: 10px; font-family: Verdana; font-size: 77%; margin: 0;">
                <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/messages;_ylc=X3oDMTJlaTBsYms1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21zZ3MEc3RpbWUDMTI0OTY4MDk4MA--">Messages</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/files;_ylc=X3oDMTJmb2oxaW5hBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2ZpbGVzBHN0aW1lAzEyNDk2ODA5ODA-">Files</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/photos;_ylc=X3oDMTJlcXRnbTVzBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3Bob3QEc3RpbWUDMTI0OTY4MDk4MA--">Photos</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/links;_ylc=X3oDMTJmaHFnMmRlBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2xpbmtzBHN0aW1lAzEyNDk2ODA5ODA-">Links</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/database;_ylc=X3oDMTJjdjdtdmdrBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2RiBHN0aW1lAzEyNDk2ODA5ODA-">Database</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/polls;_ylc=X3oDMTJmZnFwc2g3BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3BvbGxzBHN0aW1lAzEyNDk2ODA5ODA-">Polls</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJlZGg5cWo0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21icnMEc3RpbWUDMTI0OTY4MDk4MA--">Members</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/calendar;_ylc=X3oDMTJkbjltczE4BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2NhbARzdGltZQMxMjQ5NjgwOTgw">Calendar</a>  
    </div>  
    <!-- |**|end egp html banner|**| -->

                <div id="ygrp-grfd" style="font-family: Verdana; font-size: 77%; padding: 15px 0;">
                  

              </div>
    
    <!-- yahoo logo -->
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-ft" style="font-family: verdana; font-size: 77%; border-top: 1px solid #666; padding: 5px 0;">
      <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkcTZpZ2RxBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjQ5NjgwOTgx">
      <img src="http://us.i1.yimg.com/us.yimg.com/i/yg/img/logo/ma_grp_160.gif" height="15" width="106" border="0" alt="Yahoo! Groups"></a> <br>
      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/join;_ylc=X3oDMTJmcDQ0MWd0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3N0bmdzBHN0aW1lAzEyNDk2ODA5ODE-">Change settings via the Web</a> (Yahoo! ID required) <br>
      Change settings via email: <a href="mailto:TestFirstUserInterfaces-digest-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Email Delivery: Digest">Switch delivery to Daily Digest</a> | <a href = "mailto:TestFirstUserInterfaces-traditional-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Change Delivery Format: Traditional">Switch format to Traditional</a> <br>

      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJkb3IwZ3Q4BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2hwZgRzdGltZQMxMjQ5NjgwOTgx">
        Visit Your Group 
      </a> |
      <a href="http://docs.yahoo.com/info/terms/">
        Yahoo! Groups Terms of Use      </a> |
      <a href="mailto:TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=">
        Unsubscribe      </a> 
    </div>     <!-- |**|end egp html banner|**| -->
  </div> <!-- ygrp-msg -->

  
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: white;">
    <!-- Network content -->
    
<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->

	    <!-- Start vitality -->
	    <div id="ygrp-vital" style="background-color: #e0ecee; margin-bottom: 20px; padding: 2px 0 8px 8px;">
	      		<div id="vithd" style="font-size: 77%; font-family: Verdana; font-weight: bold; color: #333; text-transform: uppercase;">Recent Activity</div>
		<ul style="list-style-type:none; padding: 0; margin: 2px 0;">
		    
		    
		    
		    
		    
		    
		</ul>
	      	      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJlYjY3Nm9zBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTI0OTY4MDk4MA--">
		Visit Your Group	      </a>
	    </div> 
	    	    	      
	    <!-- Network content -->
	    	      <div style="background-color:#EEEEEE; margin-bottom:20px; padding:10px 8px;">    <div id="nc">
              <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                        <div id="hd1">Give Back</div>
  <p><a href="http://us.lrd.yahoo.com/_ylc=X3oDMTJtZjRtZ2U1BF9TAzk3MzU5NzE0BF9wAzEEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA25jbW9kBHNsawNicmFuZARzdGltZQMxMjQ5NjgwOTgw;_ylg=1/SIG=11314uv3k/**http%3A//brand.yahoo.com/forgood" style="text-decoration:none; color:#1E66AE; font-weight: normal;">Yahoo! for Good</a></p>
  <p style="color: #000000; font-weight: normal;">Get inspired</p>
  <p style="color: #000000; font-weight: normal;">by a good cause.</p>
                  </div>
                    <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                        <div id="hd1">Y! Toolbar</div>
  <p><a href="http://us.lrd.yahoo.com/_ylc=X3oDMTJvMXUxMmxxBF9TAzk3MzU5NzE0BF9wAzIEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA25jbW9kBHNsawN0b29sYmFyBHN0aW1lAzEyNDk2ODA5ODA-;_ylg=1/SIG=11c6dvmk9/**http%3A//toolbar.yahoo.com/%3F.cpdl=ygrps" style="text-decoration:none; color:#1E66AE; font-weight: normal;">Get it Free!</a></p>
  <p style="color: #000000; font-weight: normal;">easy 1-click access</p>
  <p style="color: #000000; font-weight: normal;">to your groups.</p>
                  </div>
                    <div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
                        <div id="hd1">Yahoo! Groups</div>
  <p><a href="http://groups.yahoo.com/start;_ylc=X3oDMTJvZG82cWo2BF9TAzk3MzU5NzE0BF9wAzMEZ3JwSWQDODc0NDcwNARncnBzcElkAzE3MDUwMDcyMDcEc2VjA25jbW9kBHNsawNncm91cHMyBHN0aW1lAzEyNDk2ODA5ODA-" style="text-decoration:none; color:#1E66AE; font-weight: normal;">Start a group</a></p>
  <p style="color: #000000; font-weight: normal;">in 3 easy steps.</p>
  <p style="color: #000000; font-weight: normal;">Connect with others.</p>
                  </div>
          </div>
</div>
	    
	  </div> 	  <!-- |**|end egp html banner|**| -->
	  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
	</div> 		  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=8744704/grpspId=1705007207/msgId=1049/stime=1249680981/nc1=1/nc2=2/nc3=3" width="1" height="1"> <br>
	
	<div style="color: white; clear: both;">__,_._,___</div>
	<!--~-|**|PrettyHtmlEnd|**|-~-->
	</body>
	<!--~-|**|PrettyHtmlStart|**|-~-->
	<head>
<style type="text/css">
<!--
#ygrp-mkp{
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 14px 0px;
  padding: 0px 14px;
}
#ygrp-mkp hr{
  border: 1px solid #d8d8d8;
}
#ygrp-mkp #hd{
  color: #628c2a;
  font-size: 85%;
  font-weight: bold;
  line-height: 122%;
  margin: 10px 0px;
}
#ygrp-mkp #ads{
  margin-bottom: 10px;
}
#ygrp-mkp .ad{
  padding: 0 0;
}
#ygrp-mkp .ad a{
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
	<head>
<style type="text/css">
<!--
#ygrp-sponsor #ygrp-lc{
  font-family: Arial;
}
#ygrp-sponsor #ygrp-lc #hd{
  margin: 10px 0px;
  font-weight: bold;
  font-size: 78%;
  line-height: 122%;
}
#ygrp-sponsor #ygrp-lc .ad{
  margin-bottom: 10px;
  padding: 0 0;
}
-->
</style>
</head>
	<head>
	<style type="text/css">
	<!--
	#ygrp-mlmsg {font-size:13px; font-family: arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
	#ygrp-mlmsg table {font-size:inherit;font:100%;}
	#ygrp-mlmsg select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}
	#ygrp-mlmsg pre, code {font:115% monospace;*font-size:100%;}
	#ygrp-mlmsg * {line-height:1.22em;}
	#ygrp-text{
	    font-family: Georgia;	
	}
	#ygrp-text p{
	    margin: 0 0 1em 0;
	}

	dd.last p a {
          font-family: Verdana;
          font-weight: bold;
	}

	#ygrp-vitnav{
		padding-top: 10px;
		font-family: Verdana;
		font-size: 77%;
		margin: 0;
	}
	#ygrp-vitnav a{
		padding: 0 1px;
	}
	#ygrp-mlmsg #logo{
	  padding-bottom: 10px;
	}

	#ygrp-reco {
	margin-bottom: 20px;
	padding: 0px;
	}
	#ygrp-reco #reco-head {
		font-weight: bold;
		color: #ff7900;
	}

	#reco-category{
        	font-size: 77%;
	}
	#reco-desc{
        	font-size: 77%;
	}

	#ygrp-vital a{
		text-decoration: none;
	}

	#ygrp-vital a:hover{
	  text-decoration: underline;
	}

	#ygrp-sponsor #ov ul{
		padding: 0 0 0 8px;
		margin: 0;
	}
	#ygrp-sponsor #ov li{
		list-style-type: square;
		padding: 6px 0;
		font-size: 77%;
	}
	#ygrp-sponsor #ov li a{
		text-decoration: none;
		font-size: 130%;
	}
	#ygrp-sponsor #nc{
	  background-color: #eee;
	  margin-bottom: 20px;
	  padding: 0 8px;
	}
	#ygrp-sponsor .ad{
		padding: 8px 0;
	}
	#ygrp-sponsor .ad #hd1{
		font-family: Arial;
		font-weight: bold;
		color: #628c2a;
		font-size: 100%;
		line-height: 122%;
	}
	#ygrp-sponsor .ad a{
		text-decoration: none;
	}
	#ygrp-sponsor .ad a:hover{
		text-decoration: underline;
	}
	#ygrp-sponsor .ad p{
		margin: 0;
		font-weight: normal;
		color: #000000;
	}
	o{font-size: 0; }
	.MsoNormal{
	   margin: 0 0 0 0;
	}
	#ygrp-text tt{
	  font-size: 120%;
	}
	blockquote{margin: 0 0 0 4px;}
	.replbq{margin:4}

dd.last p span {
  margin-right: 10px;
  font-family: Verdana;
  font-weight: bold;
}

dd.last p span.yshortcuts {
  margin-right: 0;
}

div.photo-title a,
div.photo-title a:active,
div.photo-title a:hover,
div.photo-title a:visited {
    text-decoration: none;
}

div.file-title a,
div.file-title a:active,
div.file-title a:hover,
div.file-title a:visited {
    text-decoration: none;
}

#ygrp-msg p#attach-count {
    clear: both;
    padding: 15px 0 3px 0;
    overflow: hidden;
}

#ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: bold;
}

div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
}

#ygrp-msg p a {
    font-family: Verdana;
}

#ygrp-mlmsg a {
    color: #1E66AE;
}

div.attach-table div div a {
    text-decoration: none;
}

div.attach-table {
    width: 400px;
}

	-->
	</style>
	</head>
	<!--~-|**|PrettyHtmlEnd|**|-~-->
	</html><!--End group email -->


--WOczvoNCb8kxiHKMNs5sW7XeBE0DVE8BU9qw3mJ--