gpt4 book ai didi

c# - 使用私有(private)构造函数和静态创建方法以及私有(private) id 属性模拟类

转载 作者:行者123 更新时间:2023-11-30 20:50:05 25 4
gpt4 key购买 nike

我正在尝试使用 AutoFixture 来简化我的生活。

我如何模拟一个类

  • 非公共(public)构造函数和
  • 非公开 Id 和
  • 静态“创建”方法?

例子

public class User
{
private User(){}

/// <summary>
/// Created by Database...
/// </summary>
public long? Id { get; protected set; }

public string Name { get; protected set; }

public static User Create(string name)
{
var user = new User {Name = name};
return user;
}
}

我试过使用 Factory 和 SpecimenBuilder 的组合:

    [Fact]
public void CreatingUserWithId_Should_Work_UsingFactoryAndSpecimenBuilder()
{
IFixture fixture = new Fixture().Customize(new AutoFakeItEasyCustomization());
fixture.Customizations.Add(new UserBuilder());
fixture.Customize<User>(o => o.FromFactory(() => User.Create("foo")));

var user = fixture.Create<User>();

user.Should().NotBeNull();
user.Id.Should().HaveValue();
}

public class UserBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi == null) return new NoSpecimen(request);

// The following code only works for public properties... :-(
if (pi.Name == "Id" && pi.PropertyType == typeof (long?)) return 42;

return new NoSpecimen(request);
}
}

演示 C# 解决方案可在 https://github.com/draptik/MockingStaticCreate 获得。

谢谢指点

帕特里克

最佳答案

AF 将做正确的事情(User.Create() 使用匿名名称 arg),没有任何自定义。

唯一缺少的一点是设置 Id .这是您必须自己回答的一个问题——您的消费代码首先应该如何做到这一点?当你决定后,你可以做 fixture.Customize<User>( c => c.FromFactory( User.Create).Do( x => ???)

也许你可以考虑公开一个接受 id 的 ctor也。然后你可以做一个Customize<User> ... GreedyConstructorQuery .

如果你的 ORM 正在做一些古怪的反射,而你喜欢它和/或不能绕过它,你可以选择你的测试是否应该:

a) 也这样做 - 如果这与给定的测试或一组测试相关

b) 认为这是可行的

关于将值混合模拟和馈入实体或值对象 - 不要那样做(Mark Seemann's Commands vs Queries article 可能会在这里帮助你)。您似乎需要/想要这样做的事实使您似乎试图在个别测试中过于雄心勃勃 - 您是否正在寻找最简单的测试方法并尝试拥有一个 Assert用最少的设置测试一件事。

去买GOOS book - 它将帮助您找到平衡这些权衡的方法。

关于c# - 使用私有(private)构造函数和静态创建方法以及私有(private) id 属性模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823648/

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