Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - nikhaldi/param-test-ruby: Parametrized unit tests for Ruby/ActiveSupport · GitHub
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

param_test

Parameterized unit tests for Ruby/ActiveSupport

This gem extends ActiveSupport::TestCase with a simple param_test class method that generates multiple tests with different parameters from a single code block.

Usage

In unit tests, you'll often want to run a set of the same assertions on multiple inputs. One way to do this is by looping over the inputs, for example:

class StringTest < ActiveSupport::TestCase
test "strings are ASCII only" do
["foo", "bar", "baz"].each do |string|
# Bad programmer! Don't do this
assert string.ascii_only?
end
end
end

Don't do this! This is almost always a bad idea. If this test fails you won't know at which of the 3 input parameters it failed. A failure will also prevent subsequent inputs from getting tested, masking other failures that you won't discover until later.

param_test addresses these problems. The above test should be rewritten like this:

require 'param_test'
class StringTest < ActiveSupport::TestCase
param_test "string %s is ASCII only",
["foo", "bar", "baz"] do |string|
assert string.ascii_only?
end
end

This will generate three separate tests, one for each of the three parameters ("foo", "bar" and "baz") passed in the second argument. Each test is independent and can fail independently.

The tests will be named after the description template passed as the first argument. Standard Ruby string formatting is used to substitute the parameters into the description. Generally you'll want to just use string substitution with %s.

You can have multiple parameters per test:

param_test "%s is uppercase %s",
[["FOO", "foo"], ["BAR", "bar"]] do |expected, param|
assert_equal expected, param.upcase
end

Each parameter set must have the same number of parameters. The description template must have a corresponding number of substitutions.

About Test Naming

Ruby's underlying unit test framework requires tests to be defined as methods beginning with test, so the description is actually converted to a valid method name. In the last example, the methods generated are :test_FOO_is_uppercase_foo and :test_BAR_is_uppercase_bar.

If string substitution would create the same method names for two different sets of parameters (this can happen because for example any all-whitespace string converts to the same single underscore), a counting variable will be added to the method name to keep them unique.

For better readability, any nil parameters will be string substituted as a "nil" string (the default string substitution for nil values is the empty string).

Installation

If using Rails 5.x, add to your Gemfile:

gem 'param_test', '~> 0.2.0'

If using Rails 4.x, add to your Gemfile:

gem 'param_test', '~> 0.1.1'

If using Rails 3.2, add to your Gemfile:

gem 'param_test', '~> 0.0.2'

(Since you generally only use param_test in tests, you probably want to add this to the group :test in your Gemfile.)

License

Distributed under an MIT license.

About

Parametrized unit tests for Ruby/ActiveSupport

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages