I'm trying to refactor some code for unit testing and was hoping you could critique it.
This is the original method:
public class MyNonRefactoredClass
{
public List<MyClass> DoSomething()
{
List<MyClass> data = GetData();
if (data.Count == 0)
return new List<MyClass>();
data = GetFormattedData(data);
if (data.Count == 0)
return new List<MyClass>();
//Do some more stuff
return data;
}
public List<MyClass> GetData()
{
//Do db query and return data
}
public List<MyClass> GetFormattedData(List<MyClass> Data)
{
//Do some logic on Data variable. Might return empty if data is not what I like
}
}
Here is my new approach. I have done it like this as I believe I need an entry point to try and access methods that I want to test.
public class MyRefactoredClass
{
public List<MyClass> DoSomething()
{
//Dependency Injection needs to work somehow here
MySeparateClass newClass = new MySeperateClass(new DataProvider());
List<MyClass> dbData = newClass.GetData();
if (db.Data.Count == 0)
return new List<MyClass>();
dbData = newClass.GetFormattedData();
if (db.Data.Count == 0)
return new List<MyClass>();
//Continue method doing other things...
}
}
public class MySeparateClass
{
private IDataProvider dbProvider;
public MySeparateClass(IDataProvider DataProvider)
{
dbProvider = DataProvider;
}
public List<MyClass> GetData()
{
//Do DB stuff
return dbProvider.GetData();
}
public List<MyClass> GetFormattedData(List<MyClass> Data)
{
//Format
}
}
[Test]
public DoSomething_DBReturnsNoData_ReturnEmptyList()
{
//Setup mock of IDataProvider
//Tell mock to not return data from GetData
//Assert that result.count == 0
}
[Test]
public DoSomething_FormattedReturnsNoData_ReturnsEmptyList()
{
//Setup mock of IDataProvider
//Tell mock to return some data from GetData
//Setup mock of MySeparateClass
//Tell mock to return no data from GetFormattedData
//Assert that result.Count == 0
}