标签: automocking

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
查看次数

MOQ和AutoFixture有什么区别?

我有很多使用MOQ的经验,而我最近偶然发现了AutoFixture.这些框架之间有什么区别?

unit-testing moq mocking autofixture automocking

12
推荐指数
1
解决办法
3085
查看次数

AutoFixture作为Automocking容器与Automocking差异?

我开始使用moq但是根据我的理解,我总是要模拟所有可以调用的方法,即使我真的不关心它们.

有时需要很长时间来模拟你忘记你想做什么的东西.所以我一直在看自动模拟,但我不确定我应该使用什么.

AutoFixture作为自动模拟容器

Automocking

我根本不知道如何使用第一个.我有点得到第二个但从未真正尝试过.

我不确定一个人是否比另一个好.我唯一知道的是我使用AutoFixtures已经是第一个的依赖.

所以也许从长远来看,与第一个一起使用是有意义的,但就像我说我找不到任何关于如何使用它的基本教程.

编辑

我试图按照"Nikos Baxevanis"的例子,但我遇到了错误.

Failure: System.ArgumentException : A matching constructor for the given arguments was not found on the mocked type.
  ----> System.MissingMethodException : Constructor on type 'DatabaseProxyded46c36c8524889972231ef23659a72' not found.


var fixture = new Fixture().Customize(new AutoMoqCustomization());
        var fooMock = fixture.Freeze<Mock<IFoo>>();
       // fooMock.Setup(x => x.GetAccounts(It.IsAny<IUnitOfWork>()));
        var sut = fixture.CreateAnonymous<AdminService>();

        sut.Apply();
        fooMock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我的petapoco unitOfWork财产

PetaPoco.Database Db { get; }
Run Code Online (Sandbox Code Playgroud)

不确定我是否要以某种方式嘲笑这个或什么.

.net c# moq autofixture automocking

12
推荐指数
1
解决办法
5616
查看次数

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

现在找到解决方案的简短内容:

AutoFixture返回冻结模拟就好了; 我的sut也是由AutoFixture生成的,只有一个公共属性,其本地默认值对于测试非常重要,并且AutoFixture设置为新值.除了Mark的答案之外,还有很多值得学习的东西.

原始问题:

我昨天开始尝试使用AutoFixture进行我的xUnit.net测试,这些测试中包含了Moq.我希望更换一些Moq的东西或者让它更容易阅读,我特别感兴趣的是在SUT工厂容量中使用AutoFixture.

我使用Mark Seemann的一些关于AutoMocking的博客文章,并尝试从那里开始工作,但我没有走得太远.

这是我的测试看起来没有AutoFixture:

[Fact]
public void GetXml_ReturnsCorrectXElement()
{
    // Arrange
    string xmlString = @"
        <mappings>
            <mapping source='gcnm_loan_amount_min' target='gcnm_loan_amount_min_usd' />
            <mapping source='gcnm_loan_amount_max' target='gcnm_loan_amount_max_usd' />
        </mappings>";

    string settingKey = "gcCreditApplicationUsdFieldMappings";

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

    ITracingService tracing = new Mock<ITracingService>().Object;

    XElement expectedXml = XElement.Parse(xmlString);

    IMappingXml sut = new SettingMappingXml(settings, tracing);

    // Act
    XElement actualXml = sut.GetXml();

    // Assert
    Assert.True(XNode.DeepEquals(expectedXml, actualXml));
}
Run Code Online (Sandbox Code Playgroud)

这里的故事很简单 - 确保使用正确的密钥(这是硬编码/属性注入)SettingMappingXml查询ISettings依赖关系并将结果返回为XElement.在 …

c# unit-testing autofixture automocking

11
推荐指数
1
解决办法
3719
查看次数

为什么Autofixture w/AutoMoqCustomization在类密封时停止抱怨缺乏无参数构造函数?

当我直接使用Moq来模拟IBuilderFactoryBuilderService在单元测试中实例化自己时,我可以通过测试来验证Create()方法是否只IBuilderFactory被调用一次.

但是,当我使用AutofixtureAutoMoqCustomization,冻结模拟IBuilderFactory和实例化BuilderServicefixture.Create<BuilderService>,我得到以下异常:

System.ArgumentException:无法实例化类的代理:OddBehaviorTests.CubeBuilder.找不到无参数构造函数.参数名称:constructorArguments

如果我进行CubeBuilder密封(通过使用SealedCubeBuilder被调用的密封类替换它来表示IBuilderFactoryForSealedBuilder.Create(),测试使用AutoFixture和AutoMoqCustomization进行传递,没有异常抛出.

我错过了什么吗?由于我直接使用Moq进行测试,我相信这与Autofixture和/或AutoMoqCustomization有关.这是理想的行为吗?如果是这样,为什么?

要重现,我正在使用:

using Moq;
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.AutoMoq;
using Xunit;
Run Code Online (Sandbox Code Playgroud)

以下是说明行为的四个测试:

public class BuilderServiceTests {
    [Fact]
    public void CubeBuilderFactoryCreateMethodShouldBeCalled_UsingMoq() {
        var factory = new Mock<IBuilderFactory>();
        var sut = new BuilderService(factory.Object);
        sut.Create();
        factory.Verify(f => f.Create(), Times.Once());
    }
    [Fact]
    public void CubeBuilderFactoryCreateMethodShouldBeCalled_UsingAutoFixture() {
        var fixture = new Fixture().Customize(new AutoMoqCustomization());
        var factory = …
Run Code Online (Sandbox Code Playgroud)

dependency-injection castle-dynamicproxy moq autofixture automocking

8
推荐指数
1
解决办法
1308
查看次数

AutoFixture使用手动假货的AutoData理论

鉴于此系统要测试:

public class MySut
{
    private readonly IHardToMockDependency _hardToMockDependency;

    public MySut(IHardToMockDependency hardToMockDependency,
                 IOtherDependency otherDependency)
    {
        _hardToMockDependency = hardToMockDependency;
    }

    public string GetResult()
    {
        return _hardToMockDependency.GetResult();
    }
}

public interface IOtherDependency { }

public interface IHardToMockDependency
{
    string GetResult();
}
Run Code Online (Sandbox Code Playgroud)

而这个单元测试:

internal class FakeHardToMockDependency : IHardToMockDependency
{
    private readonly string _result;

    public FakeHardToMockDependency(string result)
    {
        _result = result;
    }

    public string GetResult()
    {
        return _result;
    }
}

public class MyTests
{
    [Fact]
    public void GetResultReturnsExpected()
    {
        string expectedResult = "what I …
Run Code Online (Sandbox Code Playgroud)

moq xunit.net autofixture automocking

7
推荐指数
1
解决办法
2624
查看次数

Jest 快照失败:val.getMockName 不是函数

我正在尝试为小型反应组件设置快照,但我不断收到以下错误

TypeError: val.getMockName is not a function

it('renders correctly', () => {
const wrapper = renderer.create(<Partners content={content} />).toJSON()
> 
expect(wrapper).toMatchSnapshot()
               ^
})
Run Code Online (Sandbox Code Playgroud)

这是我的测试文件:

import React from 'react'
import renderer from 'react-test-renderer'
import Partners from './index'
import { content } from '../../content/anywhere-everywhere'

jest.mock('react-lazy-load', () => 'LazyLoad')

it('renders correctly', () => {
  const wrapper = renderer.create(<Partners content={content} />).toJSON()
  expect(wrapper).toMatchSnapshot()
})
Run Code Online (Sandbox Code Playgroud)

这是组件

import React from 'react'
import LazyLoad from 'react-lazy-load'

const Partners = ({ content }) => (
  <section className="partners">
    <h3>{content.partnersCopy}</h3>
    <div className="partners__slider"> …
Run Code Online (Sandbox Code Playgroud)

tdd snapshot mocking automocking jestjs

7
推荐指数
1
解决办法
3613
查看次数

是否使用Auto Mocking容器的好​​坏做法?

我最近一直致力于一个已经开始变得相当依赖的项目,并且一直在探索使用AutoMocking容器来清理我的测试并使它们不那么脆弱的想法.

我听说过反对TDD/BDD纯粹主义者使用它们的论点,说明如下:测试主题需要哪些依赖项并不是很明显,或者你可以添加你真正不需要的依赖项.对于使用它们来说,两者听起来都不是特别强烈的论据

从我的角度来看,引入一个将允许我根据需要重构,删除和引入符合业务需求的依赖项,而不必经常返回测试并引入新的模拟/存根以获得编译代码.

AutoMocking被认为是好/坏的做法吗?是否应该使用或不应该使用它?

tdd mocking automocking

6
推荐指数
1
解决办法
691
查看次数

AutoFixture.AutoMoq:将值设置为只读属性

我在AutoMoq中使用AutoFixture.我尝试创建一个类的假实例,该类具有带getter但没有setter的属性.我希望AutoFixture配置模拟,这样即使没有setter它也会返回给定的值.

我的代码是这样的:

var data = new List<Data>() { new Data() };
var userManager = fixture.Build<IRepository>()
      //.With(x => x.Data, data)
        .CreateAnonymous();
Mock.Get(userManager).Setup(x => x.Data).Returns(data);
Run Code Online (Sandbox Code Playgroud)

不幸的是,"With"方法在这种情况下不起作用,因为自动夹具说数据没有任何setter,为什么我必须通过直接调用mock来设置值.

有没有一种方法,自动夹具可以自己做到这一点,所以我不需要最后一行代码?

编辑:我犯了一个错误,代码示例不起作用.它应该是

var data = new List<Data>() { new Data() };
var userManager = fixture.CreateAnonymous<IRepository>();
Mock.Get(userManager).Setup(x => x.Data).Returns(data)
Run Code Online (Sandbox Code Playgroud)

然而,如果有一个伪实例的方法会很好.

moq autofixture automocking

6
推荐指数
1
解决办法
2722
查看次数

当为自动模拟设置自定义 AutoDataAttribute 时,告诉 AutoFixture 忽略所有递归结构的正确语法是什么?

我让 xUnit/Moq/AutoFixture 成功地协同工作,以便我可以通过测试方法输入参数自动模拟对象。我创建了一个[AutoMoqData]在每次测试中使用的自定义属性。这是该属性的代码:

using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new CompositeCustomization(new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())))
        {
            this.Fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
            this.Fixture.Behaviors.Add(new OmitOnRecursionBehavior());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我收到以下编译警告:warning CS0618: 'AutoDataAttribute.Fixture' is obsolete: 'Fixture is created lazily for the performance efficiency, so this property is deprecated as it activates the fixture immediately. If you need to customize the fixture, do that in the factory method …

moq xunit autofixture automocking automoq

5
推荐指数
1
解决办法
4644
查看次数