【发布时间】:2017-08-10 21:04:28
【问题描述】:
我需要您的帮助,以便找到一种方法来验证作为被测方法调用的参数传递的嵌套对象的值。 假设这个类:
public class AuditTrailValueObject
{
public ActionType Action { get; private set; }
public EntityType EntityType { get; private set; }
public long EntityId { get; private set; }
public DateTime StartTime { get; private set; }
public bool IsSuccess { get; private set; }
public string Remarks { get; private set; }
public AuditTrailValueObject(ActionType action, EntityType entityType, long entityId, DateTime startTime, bool isSuccess, string remarks = "")
{
Action = action;
EntityType = entityType;
EntityId = entityId;
StartTime = startTime;
IsSuccess = isSuccess;
Remarks = remarks;
}
}
并且以下接口将此类作为注入依赖项:
public interface IAuditTrailService
{
void WriteToAuditTrail(AuditTrailValueObject auditParamData);
}
现在我有了ScanService,具体取决于AuditTrailService(实现IAuditTrailService):
public long CreateScanRequest(long projectId)
{
ScanRequestWriteModel scanRequest = _scanRequestWriteModelFactory.Create(projectDetails);
long scanRequestId = _scanRequestsWriteRepository.Insert(scanRequest);
_auditTrailService.WriteToAuditTrail(new AuditTrailValueObject(ActionType.Run, EntityType.SastScanRequest, scanRequestId, DateTime.UtcNow, true));
return scanRequestId;
}
我写的测试:
[TestMethod]
public void Scan_GivenProjectId_ShouldAuditSuccess()
{
//Given
var projectId = 100;
var scanService = CreateScanService();
...
A.CallTo(() => _scanRequestWriteModelFactory.Create(projectDetails)).Returns(new ScanRequestWriteModel());
A.CallTo(() => _scanRequestsWriteRepository.Insert(A<ScanRequestWriteModel>._)).Returns(1);
//When
var scanRequestId = scanService.CreateScanRequest(projectId);
//Then
A.CallTo(() => _auditTrailService.WriteToAuditTrail(
new AuditTrailValueObject(ActionType.Run, EntityType.SastScanRequest, scanRequestId, A<DateTime>._, true, A<string>._))).MustHaveHappened();
}
运行此测试时,我得到:
System.InvalidCastException:指定的强制转换无效
如何验证AuditTrailValueObject 中嵌套参数的值?
【问题讨论】:
-
你能告诉我们错误发生在哪里吗?你有堆栈跟踪吗?有什么可以缩小范围吗?你已经在这个问题中倾倒了大量的代码。或许可以咨询stackoverflow.com/help/how-to-ask 并重新表述一下这个问题。我确实拿走了你所有的代码并尝试重现。我遇到了一些问题,因为遗漏了很多位,我不得不做出猜测。您的测试也无法编译:我认为您有重复的“A.CallTo(() => _auditTrailService.WriteToAuditTrail(”行。如果您纠正这些问题并提供完整的测试输出,我会再试一次。
-
@BlairConrad 我已经修正了你注意到的错误线路。要不要我上传所有错过的台词(可能会更累...)?
-
我认为最好指出无效演员表的来源。如果您正在捕获异常,请包含异常,包括整个堆栈跟踪。 (考虑到您已经包含的代码量,更多并没有那么糟糕。我会说要么减少多余的代码,直到你有一个非常集中的示例,要么包含足够的代码来编译和运行。)
-
@BlairConrad 我知道问题出在
A.CallTo(() => _auditTrailService.WriteToAuditTrail( **new** AuditTrailValueObject(正如@tomredffern 解释的那样)。我正在寻找另一种方法来验证scanService传递给writeToAuditTrail方法的值。