我是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没有关于数据的来源,我需要手动构建对象.
我正在尝试验证使用期望的对象参数调用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) 在开始之前,我是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) 当我注意到AutoFixture AutoMoq时,我正在寻找nuget并想要导入moq.我看到AutoFixture是为了帮助更快地编写TDD,但我找不到AutoMoq的任何示例以及它与AutoFixture的不同之处.
有人能指出我这个AutoMoq所以我可以看到它在做什么.
对某些类型使用自动混合构建方法时,如何限制生成的字符串的长度以填充对象字符串属性/字段?
我试图在我的测试用例中自动模拟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) 我有一组嵌套得相当深的数据访问类.
要构建其中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) 我有一个包含多个构造函数的数据类型,我需要AutoFixture来选择最贪婪的(一个参数最多的).默认行为是选择编号最小的构造函数.
作者的博客文章http://blog.ploeh.dk/2009/03/24/HowAutoFixtureCreatesObjects.aspx似乎并不意味着有一种方法可以覆盖这种行为,所以它是否可能,如果是这样,如何?
我们有一个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
属性的对象进行实例化.
我刚开始在我的单元测试中使用AutoFixture.AutoMoq,我发现它对于创建我不关心特定值的对象非常有帮助.毕竟,匿名对象创建就是它的全部.
我正在努力的是当我关心一个或多个构造函数参数时.采取ExampleComponent
下面:
public class ExampleComponent
{
public ExampleComponent(IService service, string someValue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我想写一个测试,我提供了一个特定的值,someValue
但是IService
由AutoFixture.AutoMoq自动创建.
我知道如何使用Freeze
我IFixture
来保持一个已注入组件的已知值,但我不太明白如何提供我自己的已知值.
这是我理想的做法:
[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) autofixture ×10
c# ×8
.net ×2
moq ×2
automocking ×1
automoq ×1
nunit ×1
unit-testing ×1
xunit.net ×1