针对我的解决方案实施Xunit测试项目
我有一个包含WebAPI,业务层和DAL的项目的解决方案。这些项目的目标框架为4.8。
我想知道我应该能够创建一个Xunit项目来测试这些项目吗?如果是这样,Xunit项目是否需要针对.NET Core 3.1或.NET 5.0? (这些是我的默认选择)
我已经尝试创建一个针对Core 3.1来测试WebAPI层的Xunit项目,并且还实现了MOQ。它似乎可以针对一种控制器方法进行测试,但是在调试测试时,它看起来似乎是模拟BL方法的返回值,但它会不断进入BL,然后将其视为DAL在正常应用下,完全忽略了模拟。
以下是API方法和测试,但是我不确定这是否正在发生,因为我没有正确编码某些内容或是否是目标框架问题。
API方法:
[System.Web.Http.HttpPost]
public Status AddAuditLog(AuditLog auditLog)
{
var status = _auditsBL.AddAuditLog(auditLog);
return status;
}
BL方法:
public Status AddAuditLog(AuditLog auditLog)
{
var status = _auditsDL.AddAuditLog(auditLog);
return status;
}
测试:
public class AuditsControllerTests
{
private readonly AuditsController _auditsController;
private readonly Mock<IAuditsBL> _AuditsBLMock;
public AuditsControllerTests()
{
_auditsController = new AuditsController();
_AuditsBLMock = new Mock<IAuditsBL>();
}
[Fact]
private void AddAuditLog_ShouldReturnStatusSuccess_WhenAuditAdded()
{
var auditLog = CreateAuditLog();
var successStatus = CreateSuccessStatus();
_AuditsBLMock.Setup(c => c.AddAuditLog(auditLog)).Returns(successStatus);
var status = _auditsController.AddAuditLog(auditLog);
Assert.IsType<Status>(status);
Assert.True(status.IsSuccess);
}
private AuditLog CreateAuditLog()
{
return new AuditLog
{
CentreId = 1,
LoggedByUserId = 1,
ModuleName = "Profile",
OperationTypeName = "Edit",
AuditMessage = "Fake Audit",
};
}
private Status CreateSuccessStatus()
{
return new Status
{
IsSuccess = true
//ErrorMessage = configuration.ErrorMessage,
//ErrorSeverity = configuration.ErrorSeverity
};
}
}
[更新]: 控制器类:
namespace ToxAware.Services.WebAPI.Controllers
{
[WebApiConfig.CamelCaseControllerConfig]
public class AuditsController : ApiController
{
private readonly IAuditsBL _auditsBL;
public AuditsController()
{
_auditsBL = new AuditsBL();
}
...
}
}
I have a solution containing three projects a WebAPI, Business layer and DAL. These projects are written with a target framework of 4.8.
What I'm wondering should I able to create a xUnit project to test these? If so does the xUnit project need to target .Net Core 3.1 or .Net 5.0? (Those are my default choices)
I have tried creating a xUnit project targeting Core 3.1 for testing the WebAPI layer and have also implemented Moq. It seems to run a test against one of the controller methods ok to a point, however while debugging the test it appears instead of faking-out the return value of mocked BL method, it keeps going further into the BL and then DAL as it would under normal application use completely ignoring the mock.
Below is the API method and test, but I'm not sure if this is happening because I haven't coded something correctly or if it is a targeted framework issue.
API Method:
[System.Web.Http.HttpPost]
public Status AddAuditLog(AuditLog auditLog)
{
var status = _auditsBL.AddAuditLog(auditLog);
return status;
}
BL Method:
public Status AddAuditLog(AuditLog auditLog)
{
var status = _auditsDL.AddAuditLog(auditLog);
return status;
}
Test:
public class AuditsControllerTests
{
private readonly AuditsController _auditsController;
private readonly Mock<IAuditsBL> _AuditsBLMock;
public AuditsControllerTests()
{
_auditsController = new AuditsController();
_AuditsBLMock = new Mock<IAuditsBL>();
}
[Fact]
private void AddAuditLog_ShouldReturnStatusSuccess_WhenAuditAdded()
{
var auditLog = CreateAuditLog();
var successStatus = CreateSuccessStatus();
_AuditsBLMock.Setup(c => c.AddAuditLog(auditLog)).Returns(successStatus);
var status = _auditsController.AddAuditLog(auditLog);
Assert.IsType<Status>(status);
Assert.True(status.IsSuccess);
}
private AuditLog CreateAuditLog()
{
return new AuditLog
{
CentreId = 1,
LoggedByUserId = 1,
ModuleName = "Profile",
OperationTypeName = "Edit",
AuditMessage = "Fake Audit",
};
}
private Status CreateSuccessStatus()
{
return new Status
{
IsSuccess = true
//ErrorMessage = configuration.ErrorMessage,
//ErrorSeverity = configuration.ErrorSeverity
};
}
}
[Update]:
Controller Class:
namespace ToxAware.Services.WebAPI.Controllers
{
[WebApiConfig.CamelCaseControllerConfig]
public class AuditsController : ApiController
{
private readonly IAuditsBL _auditsBL;
public AuditsController()
{
_auditsBL = new AuditsBL();
}
...
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论