title: MSTest with Moq - DAL setup
body: <p>I'm new to Moq, and just started on a project that's already in development. I'm responsible for setting up unit testing. There's a custom class for the DatabaseFactory that uses EnterpriseLibrary and looks like this:</p>
  
  <pre><code>public Database CreateCommonDatabase()
  {
    return CreateDatabaseInstance(string.Empty);
  }
  
  private static Database CreateDatabaseInstance(string foo)
  {
    var database = clientCode == string.Empty
        ? DatabaseFactory.CreateDatabase("COMMON")
        : new OracleDatabase(new ClientConnections().GetConnectionString(foo)));
    return database;
  }
  </code></pre>
  
  <p>Now, here's where that gets used (ResultData is another class of the type DataSet):</p>
  
  <pre><code>public ResultData GetNotifications(string foo, string foo2, Database database)
  {
      var errMsg = string.Empty;
      var retval = 0;
      var ds = new DataSet();
  
      var sqlClause =
      @"[Some SELECT statement here that uses foo]";
  
      DbCommand cm = database.GetSqlStringCommand(sqlClause);
      cm.CommandType = CommandType.Text;
  
      // Add Parameters
      if (userSeq != string.Empty)
      {
        database.AddInParameter(cm, ":foo2", DbType.String, foo2);
      }
  
      try
      {
        ds = database.ExecuteDataSet(cm);
      }
        catch (Exception ex)
      {
        retval = -99;
        errMsg = ex.Message;
      }
  
      return new ResultData(ds, retval, errMsg);
  }
  </code></pre>
  
  <p>Now, originally, the Database wasn't passed in as a parameter, but the method was creating a new instance of the DatabaseFactory using the CreateCommonDatabase method, and using it from there. However, that leaves the class untestable because I can't keep it from actually hitting the database. So, I went with Dependency Injection, and pass the Database in.</p>
  
  <p>Now, I'm stuck, because there's no way to mock Database in order to test GetNotifications. I'm wondering if I'm overly complicating things, or if I'm missing something. Am I doing this the right way, or should I be rethinking how I've got this set up?</p>
  
  <p>Edit to add more info*****</p>
  
  <p>I really don't want to test the database. I want the Data.Notifications class (above) to return an instance of ResultData, but that's all I really want to test. If I go a level up, to the Business layer, I have this:</p>
  
  <pre><code>public DataSet GetNotifications(string foo, string foo1, out int returnValue, out string errorMessage, Database database)
  {
      ResultData rd = new data.Notifications().GetNotifications(foo, foo1, database);
  
      returnValue = rd.ResultValue;
      errorMessage = rd.ErrorMessage;
  
      return rd.DataReturned;
  }
  </code></pre>
  
  <p>So, originally, the database wasn't passed in, it was the Data.Notifications class that created it - but then again, if I left it that way, I couldn't help but hit the database to test this Business layer object. I modified all of the code to pass the Database in (which gets created a the web's Base page), but now I'm just not certain what to do next. I thought I was one unit test away from having this resolved, but apparently, either I'm wrong or I've got a mental roadblock to the right path.</p>