-
Notifications
You must be signed in to change notification settings - Fork 483
Closed
Labels
Description
Same class names, in different projects both implementing the same interface with different namespaces. When using Mock.Object, the exception is thrown.
Castle.Core: 4.4.1
Moq: 4.16.1
.NETFramework: 4.7.2
TestClass
public class ReportInstanceBackwardCompatibilityTests
{
private readonly ReportInstanceRepositoryIntegrationTestsFixture _fixture;
public ReportInstanceBackwardCompatibilityTests(ReportInstanceRepositoryIntegrationTestsFixture fixture)
{
this._fixture = fixture;
this._fixture.ConfigureDataStores(new MyDataStoreCollection())
}
[Fact]
public void Test1()
{
/* On run of this test, the error should generate */
}
}
MyDataStoreCollection
public class MyDataStoreCollection: IDataStoreCollection
{
protected readonly Mock<IValidator<It.IsAnyType>> ValidatorMock;
public MyDataStoreCollection()
{
this.ValidatorMock = new Mock<IValidator<It.IsAnyType>>();
}
public void RegisterValidator<TEntity>()
where TEntity: new()
{
this.ValidatorMock.As<IValidator<TEntity>>().Setup(x => x.Validate(It.IsAny<TEntity>(), It.IsAny<System.ComponentModel.DataAnnotations.ValidationContext>())).Returns(new ValidationResults());
}
/* Exception on .Returns(this.ValidatorMock.Object); */
public IValidatorFactory GetValidatorFactory()
{
Mock<IValidatorFactory> validatorFactoryMock = new Mock<IValidatorFactory>();
validatorFactoryMock.Setup(x => x.CreateValidator<It.IsAnyType>(It.IsAny<IUnitOfWork>())).Returns(this.ValidatorMock.Object);
return validatorFactoryMock.Object;
}
}
TestFixture
public class MyFixture
{
public void ConfigureDataStores(IDataStoreCollection dataStoreCollection)
{
/* ReportingSchema.Reporting.Database.Model.ReportInstance is contained in project named 'Reporting'
* ReportInstance is contained in project named 'ReportingTenant'
* both implementing same interface
*/
dataStoreCollection.RegisterValidator<ReportingSchema.Reporting.Database.Model.ReportInstance>();
dataStoreCollection.RegisterValidator<ReportInstance>();
/* Exception when calling this method... */
dataStoreCollection.GetValidatorFactory();
}
}
IValidatorFactory
public interface IValidatorFactory
{
IValidator<TModel> CreateValidator<TModel>(IUnitOfWork uow);
IValidator<TModel> CreateValidator<TModel>();
IValidator CreateValidator(Type modelType);
}
IValidator
public interface IValidator<TModel>
{
ValidationResults Validate(TModel instance);
}
ValidationResults taken from Nuget Microsoft.Practices.EnterpriseLibrary.Validation
IDataStoreCollection
public interface IDataStoreCollection
{
void RegisterDataStore<TEntity>() where TEntity : new();
void RegisterDataStore<TEntity, TDataStore>()
where TEntity : new()
where TDataStore : IDataStore<TEntity>;
IValidatorFactory GetValidatorFactory();
}
IDataStore
public interface IDataStore<TEntity>
{
TEntity Insert(TEntity pModel);
}
IReportInstance
public interface IReportInstance
{
Guid Id { get; set; }
}
ReportingSchema ReportInstance (In project Reporting.csproj)
[Entity(Schema = "Reporting", Name = "Report_Instance", TableName = "Report_Instance")]
[EntitySecurity(ImplementsRecordSecurity = true)]
public class ReportInstance : IReportInstance
{
[Key]
[Index(IsUnique = true)]
[Column(Order = 1)]
public Guid Id {get;set;}
}
ReportingTenant schema ReportInstance (IN project ReportingTenant.csproj
[Entity(Schema = "ReportingTenant", Name = "Report_Instance", TableName = "Report_Instance")]
[EntitySecurity(ImplementsRecordSecurity = true)]
public class ReportInstance : IReportInstance
{
[Key]
[Index(IsUnique = true)]
[Column(Order = 1)]
public Guid Id {get;set;}
}
IUnitOfWork
public interface IUnitOfWork
{
IDataContext GetDataContext(Type type);
}
IDataContext
public interface IDataContext : IDisposable
{
bool InTransaction { get; }
Task<int> CommitAsync();
}
Stack Trace
at Castle.DynamicProxy.Generators.TypeElementCollection`1.Add(TElement item)
at Castle.DynamicProxy.Contributors.CompositeTypeContributor.CollectElementsToProxy(IProxyGenerationHook hook, MetaType model)
at Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.<>c__DisplayClass6_0.<GenerateCode>b__0(String n, INamingScope s)
at Castle.DynamicProxy.Generators.BaseProxyGenerator.<>c__DisplayClass34_0.<ObtainProxyType>b__0(CacheKey _)
at Castle.Core.Internal.SynchronizedDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func`3 factory)
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options)
at Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
at Moq.CastleProxyFactory.CreateProxy(Type mockType, IInterceptor interceptor, Type[] interfaces, Object[] arguments) in C:\projects\moq4\src\Moq\ProxyFactories\CastleProxyFactory.cs:line 50
at Moq.Mock`1.InitializeInstance() in C:\projects\moq4\src\Moq\Mock`1.cs:line 309
at Moq.Mock`1.OnGetObject() in C:\projects\moq4\src\Moq\Mock`1.cs:line 325
at Moq.Mock`1.get_Object() in C:\projects\moq4\src\Moq\Mock`1.cs:line 283