【发布时间】:2014-04-02 21:39:51
【问题描述】:
我正在尝试使用 AutoFixture 来简化我的生活。
我如何模拟一个类
- 非公共构造函数和
- 非公开 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);
}
}
https://github.com/draptik/MockingStaticCreate 提供演示 C# 解决方案
感谢任何指点,
帕特里克
【问题讨论】:
-
我认为你过于复杂了。您的静态方法只创建一个具有名称集的用户......只需验证它而不用模拟它。
标签: c# unit-testing mocking autofixture fakeiteasy