Fl4m3Ph03n1x

Fl4m3Ph03n1x

I have a Behaviour that forces whoever implements it to implement a couple functions. For the sake of this discussion, let’s take the examples from the behaviours documentation.

defmodule Parser do
  @callback parse(String.t) :: {:ok, term} | {:error, String.t}
  @callback extensions() :: [String.t]
end

Now, let’s imagine that I see some repetition in the modules that implement this behaviour or that I want to add an universal parse! method. The preferred approach for this would be to use dynamic dispatching:

defmodule Parser do
  @callback parse(String.t) :: {:ok, term} | {:error, String.t}
  @callback extensions() :: [String.t]

  def parse!(implementation, contents) do
    case implementation.parse(contents) do
      {:ok, data} -> data
      {:error, error} -> raise ArgumentError, "parsing error: #{error}"
    end
  end
end

But now I am left with a question. How would I test parse! ?
Since this is pretty much working like an abstarct class at this point, how would you test it?

The only way I see it would be to use a Mock for the implementation parameter, but I am not sure about this approach.

Any ideas?

Showing Posts 1 to 2

yurko

yurko

I’d go for a bit of macros and implement a module that has the repetitive pars and is used by other modules that can override this functionality. S. GenServer for an example: elixir/lib/elixir/lib/gen_server.ex at v1.7.3 · elixir-lang/elixir · GitHub unless your server module implements it’s own terminate/2 the default is called.

Qqwy

Qqwy

TypeCheck Core Team

Creating a ‘fake’, or ‘simple’ implementation of the behaviour for testing purposes is a very common approach, so you do not have to feel unsure about this one :slight_smile:.

Of course, this only is able to test the behaviour itself, not the various implementations of it.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
jaybe78
Hello, I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter). The diffic...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
widianto
I think I’ve found a small improvement I could contribute to <%= web_namespace %>.CoreComponents (installer/templates/phx_web/compo...
New

Other Trending Topics Top

garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New
webofbits
Aludel - LLM Evaluation Workbench Aludel is an embeddable Phoenix LiveView dashboard for evaluating and comparing LLM prompts across mult...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews