如何使用Mock C#在我的Service类中测试特定的方法?

问题描述:

请帮我解决我的问题。我有一个在下面给出一个服务类:如何使用Mock C#在我的Service类中测试特定的方法?

public class RateService:IRatesService 
{ 
    ... 
    public RatesDTO GetById(int Id) 
    { 
     return Mapper.Map<Rates, RatesDTO>(this.db.Rates.GetAll().Where(m => m.RateId == Id).First()); 
    } 
} 

接口IRatesServicelooks喜欢的代码示例:

public interface IRatesService 
{ 
    ..... 
    RatesDTO GetById(int Id); 
    .... 
} 

现在我尝试测试公共RatesDTO GetById(INT Id)的方法。我下面的代码给出:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mock<IRatesService> mock = new Mock<IRatesService>(); 
     mock.Setup(m => m.GetById(It.IsAny<int>())).Returns<RatesDTO>(total=>total); 

     Assert.IsNotNull(mock.Object.GetById(1)); 
    } 
} 

但是当我运行测试,我得到这样的错误:

测试名称:TestMethod1测试
真实姓名:Provider.Tests.Services.UnitTest1.TestMethod1

结果消息:

试验方法Provider.Tests.Services.UnitTest1.TestMethod1投掷 异常:System.ArgumentExceptio n:Невозможнопреобразоватьобъект типа“System.Int32”ктипу“Provider.BLL.DTO.RatesDTO”。

什么是测试服务类和方法的最佳实践?

+0

如果你想测试RateService,你应该测试具体的类,你不应该嘲笑它。当你想要单独测试类时,模拟存在于你想要模拟类依赖的对象的情况下。 – YuvShap

你正试图测试你的模拟。这没有任何意义。

你应该努力测试你的实际代码。 就你而言,你可能想确保你的GetById返回RatesDTO的正确的id值。

您可以使用Mock框架,以方便您的测试。 例如如果您正在尝试执行单元测试并且正在使用数据库层,则可能需要模拟数据库层GetAll函数并返回多个对象,然后运行测试以检查是否实际返回了正确的对象(相同的ID)。

您的RateService是被测系统。当为你的单元测试创​​建模拟时,规范就是模拟被测系统的依赖关系。

因此,鉴于您当前的服务可以说它有一个数据存储的依赖。

public class RateService : IRatesService { 
    private readonly IDbContext db; 
    public RateService(IDbContext dbContext) { 
     this.db = dbContext; 
    } 
    //... 
    public RatesDTO GetById(int Id) { 
     return Mapper.Map<Rates, RatesDTO>(this.db.Rates.GetAll().Where(m => m.RateId == Id).First()); 
    } 
    //... 
} 

IDbContext将是被测系统的依赖性。

测试RateService

[TestClass] 
public class RateServiceUnitTests { 
    [TestMethod] 
    public void Given_ValidId_GetById_Should_Return_Dto() { 
     //Arrange 
     var validId = 1; 
     var fakes = new List<Rates>() { 
      new Rates { RateId = validId } 
     }; 
     var mock = new Mock<IDbContext>(); 
     //Assuming IDbContext.Rates.GetAll() returns an IEnumerable<Rates> 
     mock.Setup(m => m.Rates.GetAll()).Returns(fakes); 
     var sut = new RateService(mock.Object); 
     //Act 
     var result = sut.GetById(validId); 
     //Assert 
     Assert.IsNotNull(result); 
    } 
} 

注意到,您还使用一个映射器时,你会嘲笑这件事。你应该确保为测试配置,否则测试将失败。在类中使用静态调用时,如果尝试隔离系统进行测试,可能会导致问题。尝试添加映射器作为依赖。