c# – 单元测试从另一个方法内部调用的方法的返回值

我有一个类似的方法:

public List<MyClass> DoSomething(string Name, string Address, string Email, ref string ErrorMessage)
{
  //Check for empty string parameters etc now go and get some data   
  List<MyClass> Data = GetData(Name, Address, Email);

  /*************************************************************    
  //How do I unit test that the data variable might be empty???    
  *************************************************************/

  List<MyClass> FormattedData = FormatData(Data);
  return FormattedData;
}

我刚学习TDD /单元测试.我的问题是,如何编写测试以确保如果GetData返回一个空列表我将ErrorMessage设置为某个东西,然后返回一个空列表?

最佳答案
在开发时,你应该留下一个“入口点”进行测试,如下所示:

public List<MyClass> DoSomething(string Name, string Address,
              string Email, ref string ErrorMessage, IDataProvider provider)
{
  //Check for empty string parameters etc now go and get some data   
  List<MyClass> Data = provider.GetData(Name, Address, Email);

  List<MyClass> FormattedData = FormatData(Data);
  return FormattedData;
}

在单元测试中,您应该模拟IDataProvider

它被称为依赖注入(DI)或控制反转(IOC)

常见的模拟库:

> NMock
> EasyMock.NET
> TypeMock Isolator商业/付费
> Rhino Mocks
> Moq
> NSubstitute
> JustMock商业/付费
> FakeItEasy
> Moles

该清单取自here

 维基百科文章:
Dependency Injection
Inversion Of Control

 NUnit伪代码:

[Test]
public void When_user_forgot_password_should_save_user()
{
    // Arrange
    var errorMessage = string.Empty;
    var dataProvider = MockRepository.GenerateStub<IDataProvider>();
    dataProvider.Stub(x => x.GetData("x", "y", "z", ref errorMessage )).Return(null);

    // Act
    var result DoSomething("x","y","z", ref errorMessage, dataProvider);

    // Assert

    //...
}

转载注明原文:c# – 单元测试从另一个方法内部调用的方法的返回值 - 代码日志