Question

This is my service class:

public class MyService
{
  private readonly MyDataContext _db;

  public MyService()
  {
    _db = new MyDataContext(GetConnectionString());
#if DEBUG
    _db.Log = Console.Error;
#endif
  }

  public void Get(int id)
  {
    return from item in _db.Items
           where item.Id == id
           select item;
  }
}

This is my test class

[TestClass]
public class MyServiceTest
{
  private MyService _service = new MyService();

  [TestMethod]
  public void CanGetSomething()
  {
     var something = _service.Get(1).ToList();
     // Asserts
  }

  [TestMethod]
  public void CanGetSomethingElse()
  {
    var somethingElse = _service.Get(2).ToList();
    // Commented out everything else.
  }
}

Running CanGetSomething and CanGetSomethingElse separately using the ReSharper 5 test runner works fine, both tests pass. However, trying to run the tests in succession by running the entire class causes the first method to pass and the second method to throw the exception

System.ObjectDisposedException: Cannot write to a closed TextWriter.

It doesn't seem to matter what method I call in the second test, anything that calls _db will cause the error. Commenting out _db.Log = Console.Error gets rid of the exception, and it will work fine.

I'd like to be able to log the error and run an entire class of tests at once, but I can't figure out why it is behaving like this.

Any ideas?

Was it helpful?

Solution

Dont share members of your test class! Not knowing resharper, but VS 2010 UnitTesting is really kean on cleaning up after running a test. My assumption for what happens here is when constructing your TestClass, your context is being initialized. And after running a single test. Resharper cleans up the resources, therefore also disposing your context.

Use a TestInitialize to create a new instance of your dataContext, therefore isolating your tests from one another

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top