gpt4 book ai didi

c# - 具有 protected 构造函数和工厂方法的对象列表的自动修复

转载 作者:行者123 更新时间:2023-11-30 23:18:54 26 4
gpt4 key购买 nike

public partial class TestObjectCode
{
/// <summary>
/// We don't make constructor public and forcing to create object using
/// <see cref="Create"/> method.
/// But constructor can not be private since it's used by EntityFramework.
/// Thats why we did it protected.
/// </summary>
protected TestObjectCode() {}

public static TestObjectCode Create(
DateTime executiontime,
Int32 conditionid,
String conditionname)
{
var @objectToReturn = new TestObjectCode
{

ExecutionTime = executiontime,
ConditionId = conditionid,
ConditionName = conditionname
};

return @objectToReturn;
}

public virtual Int32 ConditionId { get; set; }

public virtual String ConditionName { get; set; }

public virtual DateTime ExecutionTime { get; set; }
}

测试:

[Test]
[TestCase("1/1/2015", "07/5/2016")]
public void Task Should_Filter_By_Date_Range_Only(string startDate, string endDate)
{
//Arrange
var startDateTime = DateTime.Parse(startDate);
var endDateTime = DateTime.Parse(endDate);

//get randomDate between two Dates
TimeSpan timeSpan = endDateTime - startDateTime;
var randomTest = new Random();
TimeSpan newSpan = new TimeSpan(0, randomTest.Next(0, (int)timeSpan.TotalMinutes), 0);
DateTime newDate = startDateTime + newSpan;

var list = new List<TestObjectCode>();
_fixture.AddManyTo(list);
_fixture.Customize<TestObjectCode>(
c => c
.With(x => x.ExecutionTime, newDate)
.With(x => x.ConditionId, 1)
);
_fixture.RepeatCount = 7;
_fixture.AddManyTo(list);
}

由于 _fixture.Customize 和我的 ctor 被保护,上述测试失败。如果我公开它,它会起作用,但我想让它受到保护。这个类还有 15 个我没有在这里列出的属性。我还想要列表中每个项目的两个 dateRanges 之间的 randmon 日期。

如何调用工厂的 Create 方法?我需要为每个属性定义 autoFixure 吗?

Ploeh.AutoFixture.ObjectCreationException : The decorated ISpecimenBuilder could not create a specimen based on the request: EMR.Entities.AbpAuditLogs. This can happen if the request represents an interface or abstract class; if this is the case, register an ISpecimenBuilder that can create specimens based on the request. If this happens in a strongly typed Build expression, try supplying a factory using one of the IFactoryComposer methods.

最佳答案

您可以通过将 .FromFactory(new MethodInvoker(new FactoryMethodQuery())) 添加到您的自定义来使上述测试通过:

fixture.Customize<TestObjectCode>(
c => c
.FromFactory(new MethodInvoker(new FactoryMethodQuery()))
.With(x => x.ExecutionTime, newDate)
.With(x => x.ConditionId, 1));

这两个类都在 Ploeh.AutoFixture.Kernel 命名空间中定义。

尽管如此,您应该 strongly reconsider your overall approach .

关于c# - 具有 protected 构造函数和工厂方法的对象列表的自动修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com