Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用AutoMockContainer为类设置预期或模拟_Unit Testing_Dependency Injection_Mocking_Moq_Moqcontrib - Fatal编程技术网

Unit testing 使用AutoMockContainer为类设置预期或模拟

Unit testing 使用AutoMockContainer为类设置预期或模拟,unit-testing,dependency-injection,mocking,moq,moqcontrib,Unit Testing,Dependency Injection,Mocking,Moq,Moqcontrib,我正在使用Moq.Contrib的AutoMockContainer()创建一个具体类型的实例,并自动满足其依赖关系。问题是我想在AutoMockContanier.create返回的T上创建一个设置。我需要模拟,但创建返回T?下面的示例代码(以及此处的示例代码)- 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 使用NUnit.Framework; 使用最小起订量; 名称空

我正在使用Moq.Contrib的AutoMockContainer()创建一个具体类型的实例,并自动满足其依赖关系。问题是我想在AutoMockContanier.create返回的T上创建一个设置。我需要模拟,但创建返回T?下面的示例代码(以及此处的示例代码)-

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用NUnit.Framework;
使用最小起订量;
名称空间自动测试
{
公共接口ICCustomerValidator
{
布尔·伊萨杜尔特(国际年龄);
}
公共类CustomerValidator:ICCustomerValidator
{
公共学校(国际年龄)
{
返回年龄>=18岁;
}
}
公共类客户
{
专用ICCustomerValidator CustomerValidator{get;set;}
公共客户(ICCustomerValidator customerValidator)
{
CustomerValidator=CustomerValidator;
}
public int CustomerAge{get{return 10;}}
公共图书馆是客户(成人)
{
返回CustomerValidator.isadalt(CustomerAge);
}
}
[测试夹具]
公开课教师
{
[测试]
公共无效是成人的,应该是真实的,适用于20岁的顾客
{
var factory=新的MockRepository(MockBehavior.Loose);
var容器=新的AutoMockContainer(工厂);
//var customer=container.Create();
var customerMock=container.GetMock();
customerMock.Setup(x=>x.CustomerAge).Returns(20);//需要实现此设置
//Assert.IsTrue(customer.iscustomer成人());
}
}
}

看来你把事情搞复杂了。你真的不需要自动模拟。如果您想从单元测试中获得最佳效果,请保持它的简单性,重要的是将测试工作隔离开来。只需为CustomerValidator编写一个测试

[TestFixture]
public class CustomerValidatorTest
{

    [Test]
    public void IsAdult_should_be_true_for_customer_having_age_20()
    {
        var sut = new CustomerValidator();            
        int greaterThanAge = 20;

        var result = sut.IsAdult(greaterThanAge);

        Assert.IsTrue(result);
    }
}
如果您真的想测试客户,那么编写另一个测试

[TestFixture]
public class CustomerTests
{

    [Test]
    public void IsCustomerAdult_verifyIsAdultIsCalled()
    {
        var mock = new Mock<ICustomerValidator>();
        var sut = new Customer(mock.Object);

        var result = sut.IsCustomerAdult();

        mock.Verify(x => x.IsAdult(It.IsAny<int>()));
    }
}
[TestFixture]
公共类客户测试
{
[测试]
public void是客户成人版(验证称为()的成人版)
{
var mock=new mock();
var sut=新客户(模拟对象);
var result=sut.isCustomer成人();
mock.Verify(x=>x.IsAdult(It.IsAny());
}
}

在这种琐碎的测试中,您不需要自动模拟。

如果我的问题不够清楚,我很抱歉。AutoMockContainer不是出于选择,而是一个现有的实现,如果可以使用更好的实现,我愿意对其进行更改。此外,上面的例子是我实际问题的一个非常简化的视图。我在一系列调用中注入了一组依赖项。虽然我会尝试重新思考和简化我的方法,但我提供的场景应该更简单。你真的应该研究github.com/AutoFixture/AutoFixture-它是一个成熟的、维护良好的AutoMockContainer等价物
[TestFixture]
public class CustomerTests
{

    [Test]
    public void IsCustomerAdult_verifyIsAdultIsCalled()
    {
        var mock = new Mock<ICustomerValidator>();
        var sut = new Customer(mock.Object);

        var result = sut.IsCustomerAdult();

        mock.Verify(x => x.IsAdult(It.IsAny<int>()));
    }
}