<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUUFRnw7cSp7ImA9WhdTEUw.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406</id><updated>2011-07-08T02:26:57.209-07:00</updated><title>Corey's Ramblings</title><subtitle type="html">General thoughts not related to other stuff</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://coreysramblings.blogspot.com/" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CoreysRamblings" /><feedburner:info uri="coreysramblings" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>41.473451</geo:lat><geo:long>-81.735801</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><entry gd:etag="W/&quot;DU8EQXc_cSp7ImA9WxNVFko.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406.post-5901272868993703689</id><published>2009-10-27T14:09:00.001-07:00</published><updated>2009-10-27T14:10:00.949-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T14:10:00.949-07:00</app:edited><title>Getting Cucumber/Webrat to talk to outside sites with Mechanize</title><content type="html">here's a great link for me to remember on using Cucumber/Webrat/Mechanize to automate/test remote sites:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.jcoglan.com/2009/10/03/getting-started-with-cucumber-rspec-webrat-and-multiruby/"&gt;http://blog.jcoglan.com/2009/10/03/getting-started-with-cucumber-rspec-webrat-and-multiruby/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/588314958512864406-5901272868993703689?l=coreysramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/5901272868993703689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://coreysramblings.blogspot.com/2009/10/getting-cucumberwebrat-to-talk-to.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/5901272868993703689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/5901272868993703689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoreysRamblings/~3/E7Y2D1dmn_w/getting-cucumberwebrat-to-talk-to.html" title="Getting Cucumber/Webrat to talk to outside sites with Mechanize" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coreysramblings.blogspot.com/2009/10/getting-cucumberwebrat-to-talk-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcHQngyfSp7ImA9WxNVEEk.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406.post-8620562280318079145</id><published>2009-10-20T04:58:00.000-07:00</published><updated>2009-10-20T05:00:33.695-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T05:00:33.695-07:00</app:edited><title>My current podcasts</title><content type="html">Been listening to for a while&lt;br /&gt;&lt;br /&gt;Astronomy Cast&lt;br /&gt;Rails Envy&lt;br /&gt;The Thomas Jefferson Hour&lt;br /&gt;WNYC's Radio Lab&lt;br /&gt;Pragmatic Podcasts&lt;br /&gt;My History Can Beat Up Your Politics&lt;br /&gt;&lt;br /&gt;Just picked up&lt;br /&gt;&lt;br /&gt;This American Life (used to listen on the radio)&lt;br /&gt;Stuff you Missed in History Class&lt;br /&gt;The Moth Podcast&lt;br /&gt;Dan Carlin's Hardcore History&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/588314958512864406-8620562280318079145?l=coreysramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/8620562280318079145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://coreysramblings.blogspot.com/2009/10/my-current-podcasts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/8620562280318079145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/8620562280318079145?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoreysRamblings/~3/vBJlGAg-Zr0/my-current-podcasts.html" title="My current podcasts" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coreysramblings.blogspot.com/2009/10/my-current-podcasts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMDSHk5eip7ImA9WxVUFUs.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406.post-759678129970242592</id><published>2009-03-20T09:24:00.001-07:00</published><updated>2009-03-20T09:27:59.722-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-20T09:27:59.722-07:00</app:edited><title>Me meme</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_dYi-rTxxT2o/ScPDbBPIpLI/AAAAAAAACJY/O8e-0EfLM38/s1600-h/Photo+122.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/ScPDbBPIpLI/AAAAAAAACJY/O8e-0EfLM38/s320/Photo+122.jpg" alt="" id="BLOGGER_PHOTO_ID_5315306854183118002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, I got it from &lt;a href="http://blog.nexwerk.com/2009/03/20/me-meme/"&gt;enrique&lt;/a&gt;, so that's my picture. Here's the rules, I guess:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Take a picture of yourself right now.&lt;/li&gt;&lt;li&gt;Don’t change your clothes, don’t fix your hair…just take a picture. (should be super-easy with Photobooth)&lt;/li&gt;&lt;li&gt;Post that picture with NO editing.&lt;/li&gt;&lt;li&gt;Post these instructions with your picture&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/588314958512864406-759678129970242592?l=coreysramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/759678129970242592/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://coreysramblings.blogspot.com/2009/03/me-meme.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/759678129970242592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/759678129970242592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoreysRamblings/~3/eZHggRYSVK0/me-meme.html" title="Me meme" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_dYi-rTxxT2o/ScPDbBPIpLI/AAAAAAAACJY/O8e-0EfLM38/s72-c/Photo+122.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://coreysramblings.blogspot.com/2009/03/me-meme.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GQXc-eyp7ImA9WxVVEUQ.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406.post-4121176171156312223</id><published>2009-03-04T10:09:00.000-08:00</published><updated>2009-03-04T10:38:40.953-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-04T10:38:40.953-08:00</app:edited><title>Practice Sudoku Git Repository Approaches</title><content type="html">I've been talking for a while about starting a series of git repositories that can be used as tools for doing focused practices, the first of which will be a sudoku solver. This is the story of my initial attempt at setting up the git strategy, having troubles, then having David Chelimsky help me find what I think will be a better way. I am just a beginner with git, so building these repositories is also a way for me to practice my own git-fu.&lt;br /&gt;&lt;br /&gt;I'll write about my initial, failed strategy, then explain the approach that David recommended, as well as paraphrase a bit on the approach we took to get there. Of course, I'm interested in other people's opinions and ideas, as well, so feel free to comment below or write a blog post. I'm planning more of these repositories, so I expect that experience will guide me to a better repository strategy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Goal:&lt;/span&gt; I would like to have a git repository that contains a set of cucumber features for a sudoku solver. These features would contain many sudoku boards of differing difficulty, allowing someone to bypass the initial bother of finding boards to use in practice session.&lt;br /&gt;&lt;br /&gt;While I'm building the features, I am also going to be writing a sudoku solver, as well. I want to maintain a branch with just the features in it, as that will be what is pushed to github.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Attempt 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;branches:&lt;br /&gt;master = cucumber features + step definitions&lt;br /&gt;rspec = rspec examples + implementation&lt;br /&gt;&lt;br /&gt;approach:&lt;br /&gt;As I add cucumber features on master, I then rebase over to the rspec branch. The rspec branch will always have the most up-to-date features from the beginning, so I can see if things are still working, as well as access them. The rebasing will put all the feature stuff at the start of my commit tree, so it will be a similar situation to someone who is using it after all the features are written.&lt;br /&gt;&lt;br /&gt;result: massive pain&lt;br /&gt;This worked great until I started having to make some small changes to the features/support/env.rb file to include my lib code for the features to run. Well, I did it in the rspec branch, since it wasn't related to the core features. Well, this caused some merge conflicts when I was trying to rebase the master over to the rspec branch. Plus, it was a bit confusing to me to have to jump from branch to branch depending on what I was working on.&lt;br /&gt;&lt;br /&gt;retrospective:&lt;br /&gt;I only got a reasonable idea of the differences between rebase and merge last week from Tom Kersten, so I had a bit of a naive view of its uses. I still like the idea of having a clean branch with just the cucumber features, but rebasing doesn't seem to be the correct approach.&lt;br /&gt;&lt;br /&gt;Why do I even want to have the cucumber features all placed at the beginning of my commit history on the actual implementation branch? Why not just merge? With hindsight (and perhaps a bit of foresight would have been good), my initial idea doesn't really hold much water. My commit history is based on the incremental development of the features, so trying to take more recent changes that affect my implementation and pushing them back to the front of the commit log just sounds like a recipe for grief. And, amazingly, it did end with much wailing and gnashing of teeth.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paraphrase/Summary of Conversation with David&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While David was making oatmeal, I explained the rebase/merge conflict problems. After explaining my approach, he started offering some ideas around using rebasing. Pretty quickly, though, he switched his questioning more towards why I was trying to do what I was doing. It didn't take long to get to the heart of what my goal was: have a clean repository that contained just the cucumber features that would be needed to begin implementation of a sudoku solver. Here's the suggestion that David offered, and the one that I'm going to switch to.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Attempt 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;branches:&lt;br /&gt;master = cucumber features + step definitions&lt;br /&gt;implementation = rspec examples + implementation&lt;br /&gt;&lt;br /&gt;approach:&lt;br /&gt;Develop entirely on the implementation branch.&lt;br /&gt;Any changes in features directory are committed atomically&lt;br /&gt;Feature commits are marked prominently for easy identification&lt;br /&gt;Master branch gets cherry-picked feature commits merged in periodically&lt;br /&gt;Squash feature atomic commits on master into larger ones, if appropriate&lt;br /&gt;&lt;br /&gt;foreseeable result:&lt;br /&gt;Branch 'master' contains clean history of cucumber feature development. Branch 'implementation' contains always working code that actually contains a wonderful history of how I developed the practice features.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Couple Thoughts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Popping the 'why' Stack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While David and I were talking, there was a definite point when his questions took a turn towards understanding what my root problem was. After a couple of questions, the phrase 'popping the why stack' came to my mind; that was what David was doing. After making it to the root of what I wanted, he was able to offer a solution that satisfied my needs in a much simpler way. When I mentioned 'popping the why stack' to him later, he said, "that's the BDD way."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tell Don't Ask&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thinking about the proposed approach, it appears much simpler, smoother and more flexible. As I was comparing the two, it occurred to me that this was a form of the "tell don't ask" principle that we use in code. In approach 1, as I'm working on my implementation branch, I'm constantly 'asking' the master for any changes to the features. This means that, over time, we may get more and more out of sync, and I'll run into a situation when it is just too difficult to bring in any changes. In approach 2, I'm adjusting the features alongside the implementation, then I am 'telling' the master branch what changes to merge. Since the master branch isn't really doing anything with them, other than reporting on them to github, it is a much more effective design to tell it the updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/588314958512864406-4121176171156312223?l=coreysramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/4121176171156312223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://coreysramblings.blogspot.com/2009/03/practice-sudoku-git-repository.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/4121176171156312223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/4121176171156312223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoreysRamblings/~3/5hWZo8w8Zjc/practice-sudoku-git-repository.html" title="Practice Sudoku Git Repository Approaches" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://coreysramblings.blogspot.com/2009/03/practice-sudoku-git-repository.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DQH04eip7ImA9WxVQE0s.&quot;"><id>tag:blogger.com,1999:blog-588314958512864406.post-1631335358250520549</id><published>2009-01-29T12:37:00.000-08:00</published><updated>2009-01-30T17:39:31.332-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T17:39:31.332-08:00</app:edited><title>Test Utilities using extension methods</title><content type="html">So, I was working with Jeff McWherter on some TDD stuff in C# today, and I came upon a trick that I really like. When I used to do C#, I was working in the 2.0 version of the .net framework. This meant that, while I had cool things like generics and anonymous methods to help me out, I didn't have extension methods. Well, Jeff and I were working in .net 3.0, so I had the benefits.&lt;br /&gt;&lt;br /&gt;We were writing some tests that need a couple instances of a data object. Well, my first test new-ed up the instance and added it to the collection. This instance needed to have the due date property set, so I did something like this:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54731.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Well, there's a bit of annoying duplication there, so I changed it to:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54735.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;with a method later on that looks like this&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54737.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Okay, a bit better.&lt;br /&gt;&lt;br /&gt;A little bit later, we had another test fixture that used the data object in a similar way, so I was looking for a way to bring the thing() method into a scope that was available for the other fixture, as well. When I was doing 2.0, I would have probably built a base class for my test fixtures and subclasses it in both fixtures. Yuk! Those who know me know that I have a special, black, cold place in my heart for subclassing like this.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enter extension methods&lt;/h3&gt;&lt;br /&gt;I want a way to have some utility methods that I can use whenever I have a fixture that needs to build things. Aha! Let's make an interface:&lt;br /&gt;&lt;br /&gt;public interface TestsThings {}&lt;br /&gt;&lt;br /&gt;And, add an extension method to it:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54738.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Cool. Now, my test fixtures can implement TestsThings and get the method, so the construction of the lists will now look like this:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54739.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Unnecessary Construction Parameters? Yuk!&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Well, not happy to leave a bad thing bad, I decided to take it one step further. I want to be able to write&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54741.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;How to do that? Hmm.... Ah, here we go. Let's change ThingTestingUtilities to look like this:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54742.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Works much better. But, there is still a matter of duplication in the DateTime.Now... stuff. So, let's take this a step further. What if I could write this:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54744.js"&gt;&lt;/script&gt;&lt;br /&gt;That looks much better. Yeah, if I was in a different language, I'd do something like:&lt;br /&gt;this.NewThings().WithAnOffsetDueDate(1.days);&lt;br /&gt;[Update: &lt;a href="http://stevenharman.net/"&gt;Steven Harman&lt;/a&gt; alerted me that you can do this. I'm too lazy right now to implement it, though. Maybe later]&lt;br /&gt;[Update2: &lt;a href="http://twitter.com/fallenrogue"&gt;Leon Gersin&lt;/a&gt; added a comment showing how to extend it like 1.days.  Check it out.]&lt;br /&gt;&lt;br /&gt;So, let's add a helper method. The utility class looks like this now:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54745.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Cool, compiles, runs, now my construction looks like this:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/54746.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Extension methods can definitely help do some neat stuff. I don't have to subclass, I can add methods by simply implementing an interface. This also gives me the ability to create interfaces that are focused on different tasks that my test fixtures might need, so I don't have to load up subclasses with unnecessary mixes of unrelated methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/588314958512864406-1631335358250520549?l=coreysramblings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://coreysramblings.blogspot.com/feeds/1631335358250520549/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://coreysramblings.blogspot.com/2009/01/test-utilities-using-extension-methods.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/1631335358250520549?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/588314958512864406/posts/default/1631335358250520549?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoreysRamblings/~3/yrQielMiGYk/test-utilities-using-extension-methods.html" title="Test Utilities using extension methods" /><author><name>Corey Haines</name><uri>http://www.blogger.com/profile/06863615802688642075</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_dYi-rTxxT2o/SXPhBn4-19I/AAAAAAAAB8g/cBCPoilslpE/S220/3187276048_580e77883b-1.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://coreysramblings.blogspot.com/2009/01/test-utilities-using-extension-methods.html</feedburner:origLink></entry></feed>

