شروع به کار با EF Core 1.0 - قسمت 15 - نوشتن آزمونهای واحد
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۶/۱۷ ۲۱:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
{
"version": "1.0.0-*",
"testRunner": "mstest",
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"dotnet-test-mstest": "1.1.1-preview",
"MSTest.TestFramework": "1.0.1-preview",
"NETStandard.Library": "1.6.0",
"Microsoft.EntityFrameworkCore": "1.0.0",
"Microsoft.EntityFrameworkCore.InMemory": "1.0.0",
"Core1RtmEmptyTest.DataLayer": "1.0.0-*",
"Core1RtmEmptyTest.Entities": "1.0.0-*",
"Core1RtmEmptyTest.Services": "1.0.0-*",
"Core1RtmEmptyTest.ViewModels": "1.0.0-*"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dnxcore50",
"portable-net45+win8"
]
}
}
} using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace EFCore.MsTests
{
[TestClass]
public class CoreTests
{
[TestMethod]
public void Test1()
{
Assert.IsTrue(true);
}
}
}
public class ApplicationDbContext : DbContext, IUnitOfWork
{
private readonly IConfigurationRoot _configuration;
public ApplicationDbContext(IConfigurationRoot configuration)
{
_configuration = configuration;
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(
_configuration["ConnectionStrings:ApplicationDbContextConnection"]
, serverDbContextOptionsBuilder =>
{
var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
serverDbContextOptionsBuilder.CommandTimeout(minutes);
});
}
} using System;
using System.Linq;
using Core1RtmEmptyTest.DataLayer;
using Core1RtmEmptyTest.Entities;
using Core1RtmEmptyTest.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Core1RtmEmptyTest.MsTests
{
[TestClass]
public class CoreTests
{
private readonly IServiceProvider _serviceProvider;
public CoreTests()
{
var services = new ServiceCollection();
services.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase());
services.AddScoped<IUnitOfWork, ApplicationDbContext>();
services.AddScoped<IBlogService, BlogService>();
_serviceProvider = services.BuildServiceProvider();
}
[TestMethod]
public void Find_searches_url()
{
// Insert seed data into the database using one instance of the context
using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetRequiredService<IUnitOfWork>())
{
context.Set<Blog>().Add(new Blog { Url = "http://sample.com/cats" });
context.Set<Blog>().Add(new Blog { Url = "http://sample.com/catfish" });
context.Set<Blog>().Add(new Blog { Url = "http://sample.com/dogs" });
context.SaveAllChanges();
}
}
// Use a separate instance of the context to verify correct data was saved to database
using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetRequiredService<IUnitOfWork>())
{
Assert.AreEqual(3, context.Set<Blog>().Count());
Assert.AreEqual("http://sample.com/cats", context.Set<Blog>().First().Url);
}
}
// Use a clean instance of the context to run the test
using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var blogService = serviceScope.ServiceProvider.GetRequiredService<IBlogService>();
var results = blogService.GetPagedBlogsAsNoTracking(pageNumber: 0, recordsPerPage: 10);
Assert.AreEqual(3, results.Count);
}
}
}
} private readonly IServiceProvider _serviceProvider;
public CoreTests()
{
var services = new ServiceCollection();
services.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase());
services.AddScoped<IUnitOfWork, ApplicationDbContext>();
services.AddScoped<IBlogService, BlogService>();
_serviceProvider = services.BuildServiceProvider();
} using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetRequiredService<IUnitOfWork>())
{ var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = ":memory:" };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
services.AddEntityFrameworkSqlite().AddDbContext<CmsDbContext>(options => options.UseSqlite(connection)); {
"UseInMemoryDatabase": false
} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var useInMemoryDatabase = _configuration["UseInMemoryDatabase"].Equals("true", StringComparison.OrdinalIgnoreCase);
if (useInMemoryDatabase)
{
optionsBuilder.UseInMemoryDatabase();
}
else
{
optionsBuilder.UseSqlServer(
_configuration["ConnectionStrings:ApplicationDbContextConnection"]
, serverDbContextOptionsBuilder =>
{
var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
serverDbContextOptionsBuilder.CommandTimeout(minutes);
});
}
} var services = new ServiceCollection();
services.AddSingleton<IConfigurationRoot>(provider =>
{
return new Microsoft.Extensions.Configuration.ConfigurationBuilder()
.AddInMemoryCollection(new[]
{
new KeyValuePair<string,string>("UseInMemoryDatabase", "true"),
})
.Build();
});
services.AddEntityFrameworkInMemoryDatabase().AddDbContext<SampleContext>(ServiceLifetime.Scoped); private void ScopeContext<T>(Action<IUnitOfWork, T> callback)
{
using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var context = serviceScope.ServiceProvider.GetRequiredService<IUnitOfWork>())
{
callback(context, serviceScope.ServiceProvider.GetRequiredService<T>());
}
}
} ScopeContext<IBlogService>(async (context, scope) =>
{
Assert.AreEqual(3, context.Set<Blog>().Count());
Assert.AreEqual("http://sample.com/cats", context.Set<Blog>().First().Url);
}); PM> Install-Package DNTCommon.Web.Core
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<PackageTargetFallback>$(PackageTargetFallback);dnxcore50;portable-net45+win8</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<None Update="..\Sample\appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sample\DataLayer.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20170106-08" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.13" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.13" />
</ItemGroup>
</Project> <Target Name="CopyConfig" AfterTargets="AfterBuild">
<Copy SourceFiles="..\MyWebApp\appsettings.json" DestinationFolder="$(OutDir)" />
</Target> <ItemGroup>
<None Update="..\MyWebApp\appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup> var services = new ServiceCollection();
var configuration = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
.AddJsonFile("appsettings.json", reloadOnChange: true, optional: false)
.AddInMemoryCollection(new[]
{
new KeyValuePair<string,string>("UseInMemoryDatabase", "true"),
})
.Build();
services.AddSingleton<IConfigurationRoot>(provider => configuration); public static void SetRowVersionOnInsert(this IUnitOfWork uow, string table)
{
uow.ExecuteSqlCommand(
$@"
CREATE TRIGGER Set{table}RowVersion
AFTER INSERT ON {table}
BEGIN
UPDATE {table}
SET RowVersion = randomblob(8)
WHERE Id = NEW.Id;
END
");
} public static void SetRowVersionOnUpdate(this IUnitOfWork uow, string table)
{
uow.ExecuteSqlCommand(
$@"
CREATE TRIGGER Set{table}RowVersion
AFTER UPDATE ON {table}
BEGIN
UPDATE {table}
SET RowVersion = randomblob(8)
WHERE Id = NEW.Id;
END
");
} _serviceProvider.RunScopedService<IUnitOfWork>(uow =>
{
uow.SetRowVersionOnInsert(nameof(MeasurementUnit));
uow.Set<MeasurementUnit>().Add(measurementUnit1);
uow.Set<MeasurementUnit>().Add(measurementUnit2);
uow.Set<MeasurementUnit>().Add(measurementUnit3);
uow.SaveChanges();
});