标签: autofixture

事实与理论的区别? - xUnit.net

我是xUnit.net和AutoFixture的新手.

我正在开发一个"测试项目"来熟悉xUnit.net和Autofixture.有一件事我不明白.

[Fact]和之间有什么区别[Theory, AutoMoqData]

如果以下两段代码相同,你能告诉我吗?我问这个是因为测试成功了,但我想以正确的方式学习它.

[Fact]
public void UpdateVersionWillUpdateCorrectlyInRepository()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var contract = fixture.Create<VersionContract>();
    var version = fixture.Create<Version>();

    fixture.Freeze<Mock<IContractMapper>>()
        .Setup(r => r.Map(contract)).Returns(version);

    var repMock = fixture.Freeze<Mock<VersionRepository>>();

    var sut = fixture.Create<VersionManagementService>();

    sut.UpdateVersion(contract);

    repMock.Verify(r => r.UpdateVersion(version));
}
Run Code Online (Sandbox Code Playgroud)

[Theory, AutoMoqData]
public void UpdateVersionWillUpdateCorrectlyInRepository(
    VersionContract contract,
    Version version,
    [Frozen]Mock<IContractMapper> mapMock,
    [Frozen]Mock<VersionRepository> repMock,
    VersionManagementService sut)
{
    mapMock.Setup(r => r.Map(contract)).Returns(version);

    sut.UpdateVersion(contract);

    repMock.Verify(r => r.UpdateVersion(version));
}
Run Code Online (Sandbox Code Playgroud)

是什么让我认为关键词[Fact]和关键词存在差异[Theory].

我假设[Theory]关键字告诉xUnit.net框架提供的数据来自某处,其中某处是Autofixture.虽然[Fact]告诉xUnit没有关于数据的来源,我需要手动构建对象.

c# xunit.net autofixture

60
推荐指数
2
解决办法
3万
查看次数

使用Verify确认Moq模拟类中的预期参数值

我正在尝试验证使用期望的对象参数调用mock中的方法.我正在使用Moq,nUnit,并认为AutoFixture的Likeness应该完成工作.以下是我正在尝试做的简化版本.

有没有办法用AutoFixture做到这一点?有没有更好的方法来验证是否Something使用适当的参数调用?

A类中重写Equals 以比较属性值并将Verify行更改为:

barMock.Verify(m => m.Something(a));
Run Code Online (Sandbox Code Playgroud)

传递,但是我宁愿不在我的项目中像A这样的每个类中重写Equals.

namespace Test
{
    using Moq;
    using NUnit.Framework;
    using Ploeh.SemanticComparison.Fluent;

    public class A
    {
        public int P1 { get; set; }
    }
    public interface IBar
    {
        void Something(A a);
    }

    public class Foo
    {
        public A Data { get; private set; }
        public void DoSomethingWith(IBar bar)
        {
            Data = new A { P1 = 1 };
            bar.Something(Data);
        }
    }

    [TestFixture]
    public class AutoFixtureTest
    {
        [Test]
        public void …
Run Code Online (Sandbox Code Playgroud)

nunit moq autofixture

47
推荐指数
2
解决办法
3万
查看次数

无法掌握Freeze/Inject/Register之间的区别

在开始之前,我是AutoFixture的忠实粉丝,我仍然在学习如何使用该工具.所以感谢开发了Autofixture先生Ploeh和所有贡献者.

那么让我们从我的问题开始吧.

根据 AutoFixture/AutoMoq忽略注入实例/冻结模拟

上面链接的有趣部分是给出了这段代码

Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);

ISettings settings = settingsMock.Object;
fixture.Inject(settings);
Run Code Online (Sandbox Code Playgroud)

马克回答哪个可以重写

fixture.Freeze<Mock<ISettings>>()
       .Setup(s => s.Get(settingKey)).Returns(xmlString);
Run Code Online (Sandbox Code Playgroud)

它看起来像一个语法糖,使用Freeze方法是一种在流畅的界面中编写模拟,配置和自动混合容器中的注入的方法.

在对网络进行一些研究之后,Freeze和Inject之间实际上存在功能差异.我发现了这个问题:https: //github.com/AutoFixture/AutoFixture/issues/59 ,它指出了 如何在AutoFixture中冻结空实例的答案

上面链接的作者描述了Freeze方法如下:

在内部,Freeze创建一个所请求类型的实例(例如IPayPalConfiguration)然后注入它,这样当你再次请求它时它将始终返回该实例

我明白我们这样做的时候

var customer = fixture.Freeze<Order>();
Run Code Online (Sandbox Code Playgroud)

每当我们的代码请求Order类型时,它将始终使用相同的Order实例.但是如果我在Freeze构造函数中指定我希望它使用特定的实例呢?

这是一个小代码示例:

[Fact]
public void MethodeName()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    fixture.Freeze<OrderLine>(new OrderLine("Foo"));
    var order = fixture.Create<Order>();
}

public class Order
{
    private readonly OrderLine _line;

    public Order(OrderLine line)
    {
        _line = line;
    }
}
public class OrderLine
{
    private readonly …
Run Code Online (Sandbox Code Playgroud)

c# autofixture

43
推荐指数
2
解决办法
1万
查看次数

什么是AutoFixture AutoMoq?

当我注意到AutoFixture AutoMoq时,我正在寻找nuget并想要导入moq.我看到AutoFixture是为了帮助更快地编写TDD,但我找不到AutoMoq的任何示例以及它与AutoFixture的不同之处.

有人能指出我这个AutoMoq所以我可以看到它在做什么.

moq autofixture

41
推荐指数
1
解决办法
1万
查看次数

AutoFixture - 配置夹具以限制字符串生成长度

对某些类型使用自动混合构建方法时,如何限制生成的字符串的长度以填充对象字符串属性/字段?

c# autofixture

37
推荐指数
3
解决办法
1万
查看次数

自动锁定Web Api 2控制器

我试图在我的测试用例中自动模拟ApiController类.当我使用WebApi1时,它工作得很好.我开始在新项目中使用WebApi2,并且在尝试运行新测试后抛出此异常:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Security.Cryptography.CryptographicException: pCertContext is an invalid handle.
   at System.Security.Cryptography.CAPI.CertSetCertificateContextProperty(SafeCertContextHandle pCertContext, UInt32 dwPropId, UInt32 dwFlags, SafeLocalAllocHandle safeLocalAllocHandle)
   at System.Security.Cryptography.X509Certificates.X509Certificate2.set_Archived(Boolean value)
Run Code Online (Sandbox Code Playgroud)

我的测试代码:

[Theory, AutoMoqData]
public void approparte_status_code_is_returned(
    string privateKey,
    UsersController sut)
{
    var response = sut.GetUser(privateKey);
    var result = response;

    Assert.Equal(HttpStatusCode.OK, result.StatusCode);
}
Run Code Online (Sandbox Code Playgroud)

如果我手动创建sut,测试用例确实有效:

[Theory, AutoMoqData]
public void approparte_status_code_is_returned(
    string privateKey,
    [Frozen]Mock<IUserModel> stubModel)
{
    var sut = new UsersController(stubModel.Object);
    var response = sut.GetUser(privateKey);
    var result = response;

    Assert.Equal(HttpStatusCode.OK, result.StatusCode);
} …
Run Code Online (Sandbox Code Playgroud)

c# autofixture automoq

30
推荐指数
2
解决办法
3113
查看次数

如何指示AutoFixture不打扰填写某些属性?

我有一组嵌套得相当深的数据访问类.

要构建其中5个列表,需要AutoFixture超过2分钟.每单元测试2分钟就可以了.

如果我手工编写它们,我只会编写我需要的代码,因此它会更快地初始化.有没有办法告诉AutoFixture只做一些属性,所以它不能花时间在我不需要的结构区域?

例如:

public class OfficeBuilding
{
   public List<Office> Offices {get; set;}
}

public class Office
{
   public List<PhoneBook> YellowPages {get; set;}
   public List<PhoneBook> WhitePages {get; set;}
}

public class PhoneBook
{
    public List<Person> AllContacts {get; set;}
    public List<Person> LocalContacts {get; set;}
}

public class Person
{
   public int ID { get; set; }
   public string FirstName { get; set;}
   public string LastName { get; set;}
   public DateTime DateOfBirth { get; set; }
   public char Gender { get; set; …
Run Code Online (Sandbox Code Playgroud)

.net c# autofixture

24
推荐指数
2
解决办法
6945
查看次数

强制AutoFixture使用最贪婪的构造函数

我有一个包含多个构造函数的数据类型,我需要AutoFixture来选择最贪婪的(一个参数最多的).默认行为是选择编号最小的构造函数.

作者的博客文章http://blog.ploeh.dk/2009/03/24/HowAutoFixtureCreatesObjects.aspx似乎并不意味着有一种方法可以覆盖这种行为,所以它是否可能,如果是这样,如何?

c# autofixture

23
推荐指数
1
解决办法
2990
查看次数

Ploeh AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例

我们有一个MVC项目,引用了WCF服务.这些引用(ExtensionDataObject)ExtensionData为每个DTO和Response对象添加了属性,现在AutoFixture无法创建这些类型的匿名实例.

例:

public partial class SearchResultsDto : object, 
    System.Runtime.Serialization.IExtensibleDataObject, 
    System.ComponentModel.INotifyPropertyChanged {

    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    [global::System.ComponentModel.BrowsableAttribute(false)]
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
        get {
                return this.extensionDataField;
            }
        set {
                this.extensionDataField = value;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

码:

_fixture = new Fixture().Customize(new AutoMoqCustomization());
var dto = _fixture.CreateAnonymous<SearchResultsDto>();
Run Code Online (Sandbox Code Playgroud)

例外:

Ploeh.AutoFixture.ObjectCreationException:Ploeh.AutoFixture.ObjectCreationException:AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例,很可能是因为它没有公共构造函数,是抽象或非公共类型.

问题:有没有办法在AutoFixture中注册这个对象,以便它将其实例化为null其他任何东西,这将让我CreateAnonymous对所有具有ExtensionData属性的对象进行实例化.

.net c# autofixture

23
推荐指数
2
解决办法
8245
查看次数

AutoFixture.AutoMoq为一个构造函数参数提供已知值

我刚开始在我的单元测试中使用AutoFixture.AutoMoq,我发现它对于创建我不关心特定值的对象非常有帮助.毕竟,匿名对象创建就是它的全部.

我正在努力的是当我关心一个或多个构造函数参数时.采取ExampleComponent下面:

public class ExampleComponent
{
    public ExampleComponent(IService service, string someValue)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想写一个测试,我提供了一个特定的值,someValue但是IServiceAutoFixture.AutoMoq自动创建.

我知道如何使用FreezeIFixture来保持一个已注入组件的已知值,但我不太明白如何提供我自己的已知值.

这是我理想的做法:

[TestMethod]
public void Create_ExampleComponent_With_Known_SomeValue()
{
    // create a fixture that supports automocking
    IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());

    // supply a known value for someValue (this method doesn't exist)
    string knownValue = fixture.Freeze<string>("My known value");

    // create an ExampleComponent with my known value injected 
    // but without …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing autofixture automocking

22
推荐指数
5
解决办法
8749
查看次数

标签 统计

autofixture ×10

c# ×8

.net ×2

moq ×2

automocking ×1

automoq ×1

nunit ×1

unit-testing ×1

xunit.net ×1