{"id":19,"date":"2007-08-31T23:25:58","date_gmt":"2007-09-01T05:25:58","guid":{"rendered":"https:\/\/www.chrisedwards.dreamhosters.com\/blog\/?p=19"},"modified":"2011-08-21T15:13:23","modified_gmt":"2011-08-21T21:13:23","slug":"using-createsut-rather-than-testsetup","status":"publish","type":"post","link":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/","title":{"rendered":"Using CreateSUT() Rather Than TestSetup()"},"content":{"rendered":"<p>I recently attended a presentation on generics by <a href=\"http:\/\/jpboodhoo.com\/\">Jean Paul Boodhoo<\/a> for the <a href=\"http:\/\/www.adnug.org\">Austin .Net User Group.<\/a> The presentation was nothing short of amazing for many reasons, but I will save the details of that for another time. For now, I want to focus on a seemingly insignificant practice that I picked up from him there. Within his unit tests, he uses a  method called CreateSUT() to instatiate the class under test. (SUT stands for System Under Test.)<\/p>\n<pre class=\"csharp\">[Test]\r\npublic void Should_do_something()\r\n{\r\n  VideoGameLibrary library = CreateSUT();\r\n  library.doSomething();\r\n  Assert.IsTrue( library.hasDoneSomething );\r\n}\r\n\r\nprivate VideoGameLibrary CreateSUT()\r\n{\r\n  \/\/ Setup dependencies...then instantiate the class to test.\r\n  return new VideoGameLibrary(dependency1, dependency2, etc..);\r\n}<\/pre>\n<p>My first reaction to this practice was to think that it was quite useless. I thought to myself &#8220;Why not just put it in the TestSetup?&#8221; I answered that question on my own today as I began to write some tests for a class that had a lot of constructor-injected dependencies. It took several lines of code to create the dependencies for this class, and then one long line of code to call its constructor and inject those dependencies. The code was ugly, and repeated in every test&#8230;can you say code smell? It obviously needed refactoring.<\/p>\n<p>I refactored the tests to remove the duplicated code that created all the dependencies and placed them within the TestSetup(). However, I found my self hesitating to to move the creation of the primary object I was testing. Moving it to the TestSetup() would make the test a bit less clear. I prefer to have as much of a test&#8217;s details and dependencies as possible to be declared within the test itself. That way I don&#8217;t have to look far to see what I am testing. However, moving this to the TestSetup would result in using class-variables to store the object under test. From the TestMethod&#8217;s standpoint, I would just be using a class-variable that had been instantiated somewhere. There would be no apparent details of the creation of the object within the test, so the user would have to look at the TestSetup.<\/p>\n<p>Using CreateSUT() alleviates both the duplicate code and readability issues. You get the best of both worlds. You get to consolidate the setup code into one place, and you get readability by instantiating the system under test right within your test method. This makes it clear which class you are testing, its type, and where to find the code that constructs it.<\/p>\n<p>Because <a href=\"https:\/\/www.chrisedwards.dreamhosters.com\/blog\/2007\/08\/10\/clarity-is-the-prime-directive\/\">I value clarity<\/a> so highly, I will definitely be using this pattern in my testing. While on the surface it seems to be next to useless, it does have value.<\/p>\n<p>-=CE=-<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently attended a presentation on generics by Jean Paul Boodhoo for the Austin .Net User Group. The presentation was nothing short of amazing for many reasons, but I will save the details of that for another time. For now, I want to focus on a seemingly insignificant practice that I picked up from him [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,3,8],"tags":[79,36,71],"class_list":["post-19","post","type-post","status-publish","format-standard","hentry","category-net","category-test-driven-development","category-testing","tag-net","tag-tdd","tag-testing"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"ChrisEdwards\"\/>\n\t<link rel=\"canonical\" href=\"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Architester - Chris Edwards | Design, Testing &amp; Architecture\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards\" \/>\n\t\t<meta property=\"og:url\" content=\"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2007-09-01T05:25:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-08-21T21:13:23+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#article\",\"name\":\"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards\",\"headline\":\"Using CreateSUT() Rather Than TestSetup()\",\"author\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/author\\\/chrisedwards\\\/#author\"},\"publisher\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/#organization\"},\"datePublished\":\"2007-08-31T23:25:58-06:00\",\"dateModified\":\"2011-08-21T15:13:23-06:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#webpage\"},\"isPartOf\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#webpage\"},\"articleSection\":\".NET, Test-Driven Development, Testing, .NET, TDD, Testing\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\\\/\\\/architester.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/category\\\/test-driven-development\\\/#listItem\",\"name\":\"Test-Driven Development\"}},{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/category\\\/test-driven-development\\\/#listItem\",\"position\":2,\"name\":\"Test-Driven Development\",\"item\":\"http:\\\/\\\/architester.com\\\/blog\\\/category\\\/test-driven-development\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#listItem\",\"name\":\"Using CreateSUT() Rather Than TestSetup()\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#listItem\",\"position\":3,\"name\":\"Using CreateSUT() Rather Than TestSetup()\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/category\\\/test-driven-development\\\/#listItem\",\"name\":\"Test-Driven Development\"}}]},{\"@type\":\"Organization\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/#organization\",\"name\":\"Architester - Chris Edwards\",\"description\":\"Design, Testing & Architecture\",\"url\":\"http:\\\/\\\/architester.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/author\\\/chrisedwards\\\/#author\",\"url\":\"http:\\\/\\\/architester.com\\\/blog\\\/author\\\/chrisedwards\\\/\",\"name\":\"ChrisEdwards\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3476e01c3ceb55c77ff6a84486161a657ee30d427833aef52e45c6fbc2c1105e?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"ChrisEdwards\"}},{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#webpage\",\"url\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/\",\"name\":\"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/2007\\\/08\\\/31\\\/using-createsut-rather-than-testsetup\\\/#breadcrumblist\"},\"author\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/author\\\/chrisedwards\\\/#author\"},\"creator\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/author\\\/chrisedwards\\\/#author\"},\"datePublished\":\"2007-08-31T23:25:58-06:00\",\"dateModified\":\"2011-08-21T15:13:23-06:00\"},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/#website\",\"url\":\"http:\\\/\\\/architester.com\\\/blog\\\/\",\"name\":\"Architester - Chris Edwards\",\"description\":\"Design, Testing & Architecture\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"http:\\\/\\\/architester.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards","description":"","canonical_url":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#article","name":"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards","headline":"Using CreateSUT() Rather Than TestSetup()","author":{"@id":"http:\/\/architester.com\/blog\/author\/chrisedwards\/#author"},"publisher":{"@id":"http:\/\/architester.com\/blog\/#organization"},"datePublished":"2007-08-31T23:25:58-06:00","dateModified":"2011-08-21T15:13:23-06:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#webpage"},"isPartOf":{"@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#webpage"},"articleSection":".NET, Test-Driven Development, Testing, .NET, TDD, Testing"},{"@type":"BreadcrumbList","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"http:\/\/architester.com\/blog#listItem","position":1,"name":"Home","item":"http:\/\/architester.com\/blog","nextItem":{"@type":"ListItem","@id":"http:\/\/architester.com\/blog\/category\/test-driven-development\/#listItem","name":"Test-Driven Development"}},{"@type":"ListItem","@id":"http:\/\/architester.com\/blog\/category\/test-driven-development\/#listItem","position":2,"name":"Test-Driven Development","item":"http:\/\/architester.com\/blog\/category\/test-driven-development\/","nextItem":{"@type":"ListItem","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#listItem","name":"Using CreateSUT() Rather Than TestSetup()"},"previousItem":{"@type":"ListItem","@id":"http:\/\/architester.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#listItem","position":3,"name":"Using CreateSUT() Rather Than TestSetup()","previousItem":{"@type":"ListItem","@id":"http:\/\/architester.com\/blog\/category\/test-driven-development\/#listItem","name":"Test-Driven Development"}}]},{"@type":"Organization","@id":"http:\/\/architester.com\/blog\/#organization","name":"Architester - Chris Edwards","description":"Design, Testing & Architecture","url":"http:\/\/architester.com\/blog\/"},{"@type":"Person","@id":"http:\/\/architester.com\/blog\/author\/chrisedwards\/#author","url":"http:\/\/architester.com\/blog\/author\/chrisedwards\/","name":"ChrisEdwards","image":{"@type":"ImageObject","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3476e01c3ceb55c77ff6a84486161a657ee30d427833aef52e45c6fbc2c1105e?s=96&d=mm&r=g","width":96,"height":96,"caption":"ChrisEdwards"}},{"@type":"WebPage","@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#webpage","url":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/","name":"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards","inLanguage":"en-US","isPartOf":{"@id":"http:\/\/architester.com\/blog\/#website"},"breadcrumb":{"@id":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/#breadcrumblist"},"author":{"@id":"http:\/\/architester.com\/blog\/author\/chrisedwards\/#author"},"creator":{"@id":"http:\/\/architester.com\/blog\/author\/chrisedwards\/#author"},"datePublished":"2007-08-31T23:25:58-06:00","dateModified":"2011-08-21T15:13:23-06:00"},{"@type":"WebSite","@id":"http:\/\/architester.com\/blog\/#website","url":"http:\/\/architester.com\/blog\/","name":"Architester - Chris Edwards","description":"Design, Testing & Architecture","inLanguage":"en-US","publisher":{"@id":"http:\/\/architester.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Architester - Chris Edwards | Design, Testing &amp; Architecture","og:type":"article","og:title":"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards","og:url":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/","article:published_time":"2007-09-01T05:25:58+00:00","article:modified_time":"2011-08-21T21:13:23+00:00","twitter:card":"summary","twitter:title":"Using CreateSUT() Rather Than TestSetup() | Architester - Chris Edwards"},"aioseo_meta_data":{"post_id":"19","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-03 04:59:47","updated":"2025-12-10 07:13:36","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"http:\/\/architester.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"http:\/\/architester.com\/blog\/category\/test-driven-development\/\" title=\"Test-Driven Development\">Test-Driven Development<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tUsing CreateSUT() Rather Than TestSetup()\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"http:\/\/architester.com\/blog"},{"label":"Test-Driven Development","link":"http:\/\/architester.com\/blog\/category\/test-driven-development\/"},{"label":"Using CreateSUT() Rather Than TestSetup()","link":"http:\/\/architester.com\/blog\/2007\/08\/31\/using-createsut-rather-than-testsetup\/"}],"_links":{"self":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/comments?post=19"}],"version-history":[{"count":3,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/19\/revisions"}],"predecessor-version":[{"id":373,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/19\/revisions\/373"}],"wp:attachment":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/media?parent=19"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/categories?post=19"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/tags?post=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}