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
C# 依赖注入和双重测试_C#_Unit Testing_Dependency Injection - Fatal编程技术网

C# 依赖注入和双重测试

C# 依赖注入和双重测试,c#,unit-testing,dependency-injection,C#,Unit Testing,Dependency Injection,我不熟悉使用依赖项注入。例如,我有这样一个示例服务: public class ValidationService<T> where T : Entity<T> { private IRepository<T> repository; private IValidator<T> validator; public ValidationService(IRepository<T> repository, IVa

我不熟悉使用依赖项注入。例如,我有这样一个示例服务:

public class ValidationService<T> where T : Entity<T>
{
    private IRepository<T> repository;
    private IValidator<T>  validator;

    public ValidationService(IRepository<T> repository, IValidator<T> validator)
    {
        this.repository = repository;
        this.validator  = validator;
    }

    public String ValidationMessage 
    { 
        get;
        private set;
    }

    public Boolean TryValidate(Guid Id)
    {
        try 
        {
            var item = repository.Get(Id);

            if(null != item)
            {
                this.Validator.ValidateAndThrow(entity);
                return true;
            }
            this.ValidationMessage = String.Format("item {0} doesn't exist in the repository", Id);
        }
        catch(ValidationException ex)
        {
            this.ValidationMessage = ex.Message;
        }
        return false;
    }
}

是的,绝对是。让您的单元测试用mock实例化服务,让您的应用程序通过真正的实现

示例(使用最小起订量):

公共类实体,其中T:Entity{}
公共类MyEntity:实体{}

var mockValidator=new Mock();
var mockRepository=new Mock();
var id=Guid.NewGuid();
var entity=new MyEntity();
mockRepository.Setup(r=>r.Get(id)).Returns(entity);
mockValidator.Setup(v=>v.ValidateAndThrow(实体));
IsTrue(新的ValidationService(mockRepository.Object,mockValidator.Object).TryValidate(id));
mockRepository.VerifyAll();
mockValidator.VerifyAll();

您确定该类型约束吗?它是否应该在T:Entitypossible重复@MylesMcDonnell?为什么不呢?因为(除非我现在是个笨蛋)不可能用该类型约束实例化ValidationService。请参见此处:@mylescdonnell查看编辑。
public class Entity<T> where T : Entity<T>
{
    public Boolean GotInstantiated { get { return true; } }         
}
public class Service<T> where T : Entity<T>
{
    public Boolean GetInstantiated(T entity)
    {
        return entity.GotInstantiated;
    }
}
public class Dunce : Entity<Dunce>
{       
}

class Program
{
    public static void Main(String[] args)
    {
        var instance = new Dunce();
        var service  = new Service<Dunce>();

        Console.Write(service.GetInstantiated(instance) + Environment.NewLine);
        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}
public class Entity<T> where T : Entity<T>{}

public class MyEntity : Entity<MyEntity>{}
var mockValidator = new Mock<IValidator<MyEntity>>();
var mockRepository = new Mock<IRepository<MyEntity>>();

var id = Guid.NewGuid();
var entity = new MyEntity();

mockRepository.Setup(r => r.Get(id)).Returns(entity);
mockValidator.Setup(v => v.ValidateAndThrow(entity));

Assert.IsTrue(new ValidationService<MyEntity>(mockRepository.Object, mockValidator.Object).TryValidate(id));

mockRepository.VerifyAll();
mockValidator.VerifyAll();