markrendle / Simple.Data

A light-weight, dynamic data access component for C# 4.0
MIT License
1.33k stars 302 forks source link

MEF creates trouble for integration tests #392

Open fallwest opened 8 years ago

fallwest commented 8 years ago

I have to fight with MEF on my sever run of unit / integration tests. I have got past not finding the Ado provider with the code sample below but then run up against "SimpleDataException:

Simple.Data.SimpleDataException: No System.Data.SqlClient Provider found.. at Simple.Data.MefHelper.Compose[T](String contractName)" 

Would rather have feature that allows me to circumvent MEF for testing.

        [ClassInitialize]
        public static void ClassInitialize(TestContext testContext)
        {
            //Hack to avoid strange error that only occurs on automatic test server.
            //Error message: Simple.Data.SimpleDataException: No Ado Provider found. at Simple.Data.MefHelper.Compose[T](String contractName)
            var adoAdapter = new AdoAdapter();
            adoAdapter.Setup(new
            {
                ConnectionString = "Data Source=(local);Initial Catalog=DB;Integrated Security=True;User Instance=False",
                ProviderName = "System.Data.SqlClient"
            });

            Database.UseMockAdapter(adoAdapter);
        }

I have, of course, added all nuget packages to the test project.

fallwest commented 8 years ago

Update:

Got this to work with by adding the following class to my test project:

using System.ComponentModel.Composition;
using Simple.Data.Ado;
using Simple.Data.SqlServer;

namespace Blabla.AppServer.Integration.Tests
{
    /// <summary>
    /// Noe spesiell dritt som trengs fordi Simple.Data bruker reflection og MEF som gjør at enhetstester feiler bare på byggserver
    /// </summary>
    // ReSharper disable once RedundantExtendsListEntry

    [Export(typeof(IConnectionProvider))]
    [Export("System.Data.SqlClient", typeof(IConnectionProvider))]
    // ReSharper disable once RedundantExtendsListEntry
    public class ConnectionProvider : SqlConnectionProvider, IConnectionProvider
    {
    }
}