Tisa.BpmTesting
2026.9.10.313
dotnet add package Tisa.BpmTesting --version 2026.9.10.313
NuGet\Install-Package Tisa.BpmTesting -Version 2026.9.10.313
<PackageReference Include="Tisa.BpmTesting" Version="2026.9.10.313" />
<PackageVersion Include="Tisa.BpmTesting" Version="2026.9.10.313" />
<PackageReference Include="Tisa.BpmTesting" />
paket add Tisa.BpmTesting --version 2026.9.10.313
#r "nuget: Tisa.BpmTesting, 2026.9.10.313"
#:package Tisa.BpmTesting@2026.9.10.313
#addin nuget:?package=Tisa.BpmTesting&version=2026.9.10.313
#tool nuget:?package=Tisa.BpmTesting&version=2026.9.10.313
Tisa.BpmTesting
Тестовый фреймворк для модульного и интеграционного тестирования приложений на платформе BPMSoft от компании ТИСА.
Возможности
- Моки для платформы BpmSoft:
UserConnectionMock,EntitySchemaManagerMock,EntitySchemaQueryMock,EntitySchemaMock, моки для сущностей и запросов - Клиент BPM: абстракции и реализация HTTP-клиента для обращения к BpmSoft Core API (
IBpmClient,BpmClient,BpmCoreService) - Интеграционные тесты: базовые классы и хелперы для тестирования с реальным BPM или тестовым окружением
- Совместимость с xUnit, NSubstitute, AutoFixture
- Целевые платформы: .NET 8.0, .NET 9.0, .NET 10.0
Установка
Подключите пакет к тестовому проекту:
dotnet add package Tisa.BpmTesting
Или в .csproj тестового проекта:
<PackageReference Include="Tisa.BpmTesting" Version="2026.9.10.0313" />
Зависимости
- BPMSoftSDK — доступен на nuget.org; подключается автоматически при установке пакета.
- Остальные зависимости (Flurl, NSubstitute, Polly, Serilog, xunit и др.) подключаются с nuget.org при установке пакета.
Использование
Примеры тестов использования объектов платформы BPMSoft (UserConnection, Entity, PluginContext, ExecutorContext, EntityImage, IDataReader) с моками Tisa.BpmTesting и xUnit.
UserConnectionMock
Мок UserConnection. Неявно приводится к UserConnection.
var userConnection = new UserConnectionMock();
UserConnection uc = userConnection;
var executor = userConnection.EnsureDBConnection();
var schemaManager = userConnection.EntitySchemaManager;
var currentUser = userConnection.CurrentUser;
EntityMock
Мок Entity. Колонки задаются через константы метаданных.
var userConnection = new UserConnectionMock();
var entity = new EntityMock(userConnection, EntityMetadata.TisaArticle);
entity.PrimaryColumnValue = Guid.NewGuid();
entity.SetColumnValue(ArticleMetadata.Cost, 1000m);
entity.SetColumnValue(ArticleMetadata.Lot, 5);
entity.SetColumnValue(ArticleMetadata.StatusCodeIdField, ArticleStatusSet.Assessment);
var cost = entity.GetTypedColumnValue<decimal>(ArticleMetadata.Cost);
entity.SetOldValue(ArticleMetadata.Cost, 500m);
entity.SetEntityValue(ArticleMetadata.DemandIdField, demandId);
Entity e = entity;
EntityImage (образ сущности для PluginContext)
Создаётся с логическим именем и Id, атрибуты задаются константами метаданных.
var targetEntity = new EntityImage(EntityMetadata.TisaArticle, entityId);
targetEntity.SetAttributeValue(ArticleMetadata.Cost, 1000m);
targetEntity.SetAttributeValue(ArticleMetadata.Quantity, 2m);
targetEntity.SetAttributeValue(ArticleMetadata.StatusCodeIdField, ArticleStatusSet.Assessment);
var context = new PluginContext(
entity,
entityId: entity.PrimaryColumnValue,
entityType: EntityMetadata.TisaArticle,
entityEvent: EntityEvent.Saving,
targetEntity: targetEntity);
DataReaderMock
Мок IDataReader для тестов Mapper. Ключи — константы из *Metadata. Перед маппингом обязателен Read().
var dataRow = new Dictionary<string, object?>
{
{ EntityMetadata.Id, Guid.NewGuid() },
{ ArticleMetadata.Code, "TEST-001" },
{ ArticleMetadata.Cost, 1000m },
{ ArticleMetadata.StatusCodeId, Guid.NewGuid() }
};
var reader = DataReaderMock.CreateWithData(dataRow);
reader.Read();
var article = _mapper.MapMinimal(reader);
Несколько строк:
var rows = new List<Dictionary<string, object?>>
{
new Dictionary<string, object?> { { EntityMetadata.Id, id1 }, { ArticleMetadata.Code, "A1" } },
new Dictionary<string, object?> { { EntityMetadata.Id, id2 }, { ArticleMetadata.Code, "A2" } }
};
var reader = DataReaderMock.CreateWithData(rows);
Пустой reader (для теста исключения):
var emptyReader = new DataReaderMock();
Assert.Throws<InvalidOperationException>(() => _mapper.MapMinimal(emptyReader));
EntityData (тестовый словарь атрибутов)
Образ сущности как словарь. Используется при необходимости явно работать с атрибутами без EntityImage.
var data = new EntityData("TisaArticle", Guid.NewGuid());
data.SetAttributeValue("TisaCost", 1000m);
data.SetAttributeValue("TisaCode", "ART-001");
var cost = data.GetAttributeValue<decimal>("TisaCost");
bool has = data.Contains("TisaCost", "TisaCode");
ExecutorContext
Контекст исполнителя: параметры и результаты через именованные ключи.
var context = new ExecutorContext(userConnection);
context.SetParameter("Target", new EntityValue(contractId, "TisaContract"));
context.SetParameter("IsCreateAll", true);
context.SetResult("ContractStep", 1);
context.SetResult("DateStart", DateTime.Now);
Требования
- .NET 8.0, .NET 9.0 или .NET 10.0
Лицензия
MIT License
Поддержка
По вопросам поддержки и сообщений об ошибках: support@tisn.ru
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AutoFixture.AutoNSubstitute (>= 4.18.1)
- BPMSoftSDK (>= 1.9.0.14114)
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- Newtonsoft.Json (>= 13.0.4)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 10.0.1)
- Npgsql.Json.NET (>= 10.0.2)
- Polly (>= 8.6.6)
- Polly.Contrib.WaitAndRetry (>= 1.1.1)
- Serilog (>= 4.3.1)
- SQLitePCLRaw.bundle_e_sqlite3 (>= 3.0.2)
- System.Configuration.ConfigurationManager (>= 10.0.5)
- System.Drawing.Common (>= 10.0.5)
-
net8.0
- AutoFixture.AutoNSubstitute (>= 4.18.1)
- BPMSoftSDK (>= 1.9.0.14114)
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.5)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.5)
- Microsoft.Extensions.Options (>= 10.0.5)
- Newtonsoft.Json (>= 13.0.4)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 8.0.11)
- Npgsql.Json.NET (>= 10.0.2)
- Polly (>= 8.6.6)
- Polly.Contrib.WaitAndRetry (>= 1.1.1)
- Serilog (>= 4.3.1)
- SQLitePCLRaw.bundle_e_sqlite3 (>= 3.0.2)
- System.Configuration.ConfigurationManager (>= 10.0.5)
- System.Drawing.Common (>= 10.0.5)
-
net9.0
- AutoFixture.AutoNSubstitute (>= 4.18.1)
- BPMSoftSDK (>= 1.9.0.14114)
- Flurl (>= 4.0.0)
- Flurl.Http (>= 4.0.2)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.5)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.5)
- Microsoft.Extensions.Options (>= 10.0.5)
- Newtonsoft.Json (>= 13.0.4)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 9.0.4)
- Npgsql.Json.NET (>= 10.0.2)
- Polly (>= 8.6.6)
- Polly.Contrib.WaitAndRetry (>= 1.1.1)
- Serilog (>= 4.3.1)
- SQLitePCLRaw.bundle_e_sqlite3 (>= 3.0.2)
- System.Configuration.ConfigurationManager (>= 10.0.5)
- System.Drawing.Common (>= 10.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2026.9.10.313 | 23 | 3/13/2026 |
| 2026.9.10.310 | 76 | 3/8/2026 |
| 2026.9.10.306 | 83 | 3/5/2026 |
| 2026.9.10.305 | 79 | 3/5/2026 |
| 2026.9.10.300 | 76 | 3/5/2026 |