Установите ожидание или макет для класса с помощью AutoMockContainer
Я использую AutoMockContainer ( https://code.google.com/p/moq-contrib/wiki/Automocking) из Moq.Contrib для создания экземпляра конкретного типа и автоматического удовлетворения его зависимостей. Проблема в том, что я хочу создать настройку T, возвращенную AutoMockContanier.Create. Мне нужен Mock для этого, но Create возвращает T? Пример кода ниже (а также здесь https://dotnetfiddle.net/Sa1jCq) -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using Moq;
namespace AutoMoqTest
{
public interface ICustomerValidator
{
bool IsAdult(int age);
}
public class CustomerValidator:ICustomerValidator
{
public bool IsAdult(int age)
{
return age >= 18;
}
}
public class Customer
{
private ICustomerValidator CustomerValidator { get; set; }
public Customer(ICustomerValidator customerValidator)
{
CustomerValidator = customerValidator;
}
public int CustomerAge { get { return 10; } }
public bool IsCustomerAdult()
{
return CustomerValidator.IsAdult(CustomerAge);
}
}
[TestFixture]
public class DITest
{
[Test]
public void IsAdult_should_be_true_for_customer_having_age_20()
{
var factory = new MockRepository(MockBehavior.Loose);
var container = new AutoMockContainer(factory);
//var customer = container.Create<Customer>();
var customerMock = container.GetMock<Customer>();
customerMock.Setup(x=>x.CustomerAge).Returns(20); //NEED TO ACHIEVE THIS SETUP
// Assert.IsTrue(customer.IsCustomerAdult());
}
}
}
1 ответ
Кажется, вы все усложнили. Вам действительно не нужен Auto Mocking. Если вы хотите получить максимальную отдачу от модульного тестирования, держите его простым, а главное - проверяйте вещи изолированно. Просто напишите тест для 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>()));
}
}
Вам не нужно AutoMocking в таких тривиальных тестах.