如何使用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”。
什么是测试服务类和方法的最佳实践?
你正试图测试你的模拟。这没有任何意义。
你应该努力测试你的实际代码。 就你而言,你可能想确保你的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);
}
}
注意到,您还使用一个映射器时,你会嘲笑这件事。你应该确保为测试配置,否则测试将失败。在类中使用静态调用时,如果尝试隔离系统进行测试,可能会导致问题。尝试添加映射器作为依赖。
如果你想测试RateService,你应该测试具体的类,你不应该嘲笑它。当你想要单独测试类时,模拟存在于你想要模拟类依赖的对象的情况下。 – YuvShap